2016-04-09 3 views
4

Ich habe ein Problem mit dem folgenden Code:Wie initialisiert man eine Liste der Werte von std :: vector in 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 

Ich brauche globalArr mit Werten initialisiert werden: "a", "b", "c", "e", "f", "g" (in einer Dimension). Ich brauche keine zweidimensionale Anordnung. Was mache ich falsch?

Ich kann etwas tun:

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

aber hier ist die globalArr const nicht mehr :) Ich brauche die gleiche Art für alle drei Vektoren.

+0

warum Sie a, b, c, d, e, f Stecken Sie nicht nur zu schreiben , g in globalArr ?? Warum verschwenden Sie Platz, indem Sie in zwei separate Vektoren einfügen und zurück in globalArr einfügen? – Bthegreatest

+0

@Bthegreatest - weil es sehr unangenehm ist, wenn ich Werte von arr1 oder arr2 manchmal ändere und vergiss, die gleichen Werte in globalArr zu ändern. – JavaRunner

+0

@JavaRunner, also wollen Sie 'globalArr' mit den Werten innerhalb' arr1' und 'arr2' initialisieren? – Alejandro

Antwort

6

Sie könnten eine Funktion implementieren, die sie nur summiert. Sprich, 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; 
} 

Und dann nur, dass verwenden:

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; 

Die Funktion alles genannt werden konnte, nahm ich nur + der Einfachheit halber.

+1

oder 'concat' wie in Bereich-v3, kombiniert mit einem' to_vector' – TemplateRex

0

Wenn alles, was Sie versuchen, einfach zu tun ist, setzen die Elemente von arr1 und arr2 in globaArr, warum eine nicht-Schleife verwenden?

Beispiel:

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)); 
} 

Noch besser wäre es, schreiben Sie einfach eine Funktion, die in globaArr und einen Vektor nimmt, den Sie von zu globaArr hinzufügen möchten. Setzen Sie die for-Schleife in die Funktion und rufen Sie die Funktion zweimal auf. Ein bisschen mehr Arbeit, aber wahrscheinlich sauberer Code.

+1

Ist das nicht das gleiche wie 'globalArr.insert (globalArr.end(), arr1.begin(), arr1.end());' gefolgt von der gleichen für 'arr2'? – Alejandro

+0

Ah, ja. Ich habe nicht darüber nachgedacht und deinen Kommentar nicht gesehen, nachdem ich gepostet habe. Das würde funktionieren, definitiv weniger Code als das, was ich vorgeschlagen habe. –

+0

Dieser Code ist viel weniger hässlich, wenn Sie eine Entfernungsangabe verwenden. –

2

In der kommenden Ranges TS, wird es möglich sein, die Lösung von @Barry als

#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

Verwandte Themen