2016-04-09 3 views
4

У меня есть проблема со следующим кодом:Как инициализировать список значений std :: vector в C++ 11?

const std::vector <std::string> arr1 = { "a", "b", "c" }; 
const std::vector <std::string> arr2 = { "e", "f", "g" }; 
const std::vector <std::string> globaArr = { arr1, arr2 }; // error 

, что нужно для инициализации globalArr со значениями: "а", "б", "C", "E", "F", "G" (в одном измерении). Мне не нужно иметь двумерный массив. Что я делаю неправильно?

я могу сделать что-то вроде этого:

globalArr.push_back(arr1); // with the for loop inserting each value of arr1 
globalArr.push_back(arr2); 

но здесь globalArr не константные больше :) Мне нужен тот же тип для всех трех векторов.

+0

почему вы не просто вставить, B, C, D, E, F , g в globalArr ?? Idk, почему вы теряете пространство, вставляя в 2 отдельных вектора и вставляя обратно в globalArr? – Bthegreatest

+0

@Bthegreatest - потому что очень неудобно, если я иногда меняю значения arr1 или arr2 и забываю изменять одни и те же значения в globalArr. – JavaRunner

+0

@JavaRunner, поэтому вы хотите инициализировать 'globalArr' значениями в' arr1' и 'arr2'? – Alejandro

ответ

6

Вы можете реализовать функцию, которая просто их суммирует. Скажем, operator+:

template <class T> 
std::vector<T> operator+(std::vector<T> const& lhs, 
         std::vector<T> const& rhs) 
{ 
    auto tmp(lhs); 
    tmp.insert(tmp.end(), rhs.begin(), rhs.end()); 
    return tmp; 
} 

, а затем просто использовать, что:

const std::vector<std::string> arr1 = { "a", "b", "c" }; 
const std::vector<std::string> arr2 = { "e", "f", "g" }; 
const std::vector<std::string> sum = arr1 + arr2; 

Эта функция может называться как угодно, я просто выбрал + для простоты.

+1

или 'concat', как в диапазоне-v3, в сочетании с' to_vector' – TemplateRex

0

Если все, что вы пытаетесь сделать, это просто поставить элементы из arr1 и arr2 в globaArr, почему бы не использовать для цикла?

Пример:

for (int i = 0; i < (int)arr1.size(); i++) { 
    globaArr.push_back(arr1.at(i)); 
} 

for (int i = 0; i < (int)arr2.size(); i++) { 
    globaArr.push_back(arr1.at(i)); 
} 

еще лучше, просто написать функцию, которая принимает в globaArr и вектор, который вы хотите добавить в globaArr с. Поместите цикл for в функцию и дважды вызовите функцию. Немного больше работы, но, вероятно, более чистый код.

+1

Разве это не то же самое, что 'globalArr.insert (globalArr.end(), arr1.begin(), arr1.end());' за ним следует то же самое для 'arr2'? – Alejandro

+0

А, да. Не думал об этом и не видел твой комментарий после отправки. Это сработало бы, конечно, меньше кода, чем я предложил. –

+0

Этот код намного менее уродлив, если вы используете дальномер. –

2

В предстоящем Ranges TS, можно будет записать решение по @Barry в

#include <range/v3/all.hpp> 
#include <iostream> 
#include <iterator> 
#include <string> 
#include <vector> 

int main() 
{ 
    using namespace ranges; 

    const std::vector<std::string> arr1 = { "a", "b", "c" }; 
    const std::vector<std::string> arr2 = { "e", "f", "g" }; 
    const auto sum = view::concat(arr1, arr2) | to_vector; 

    std::copy(sum.begin(), sum.end(), std::ostream_iterator<std::string>(std::cout, ",")); 
} 

Live Example