2014-10-09 48 views
1

我可以這樣做嗎?將載體插入另一個載體

std::vector<std::vector<std::string>> vec; 

vec.push_back(std::vector<std::string>("abc", "cde", "fgh", "ijk")); 
vec.push_back(std::vector<std::string>("abc", "cde", "fgh", "ijk")); 
vec.push_back(std::vector<std::string>("abc", "cde", "fgh", "ijk")); 

我已經知道了我想要的值,並且試圖創建一個像這樣的3 x 4向量。

編輯:我也更喜歡C++ 03解決方案,因爲我的編譯器不支持C++ 11。

+0

這是一個矢量開始,當然你可以。 – 2014-10-09 13:03:31

+0

出於某種原因,我在Visual C++編譯器2012中遇到錯誤 – user963241 2014-10-09 13:04:34

+1

向我們顯示錯誤以及導致錯誤的整個函數。 – 2014-10-09 13:05:41

回答

4

您需要使用:

vec.push_back(std::vector<std::string>({ "abc", "cde", "fgh", "ijk" })) ; 
             ~~       ~~ 

我已經知道哪些值

那爲什麼不呢? (C++ 11)

std::vector<std::vector<std::string>> vec 
{ 
{ "abc", "cde", "fgh", "ijk" }, 
{ "abc", "cde", "fgh", "ijk" }, 
{ "abc", "cde", "fgh", "ijk" }, 
} ; 
+0

當然,如果所有三行真的應該是平等的,還有更好的方法來做到這一點。 – 2014-10-09 13:06:05

+0

都是C++ 11的解決方案嗎? – user963241 2014-10-09 13:32:57

+0

@ user963241 _(un)fortunately_ yes – P0W 2014-10-09 13:54:10

0

你可以有載體向量,但是你錯誤地初始化它們。沒有構造函數接受4個T類型的參數。然而,你可以使它們成爲自C++ 11以來的初始化列表。

#include <iostream> 
#include <vector> 
#include <string> 
using namespace std; 

int main() { 
    std::vector<std::vector<std::string>> vec; 
    vec.push_back(std::vector<std::string>({"abc", "cde", "fgh", "ijk"})); 
    vec.push_back(std::vector<std::string>({"abc", "cde", "fgh", "ijk"})); 
    vec.push_back(std::vector<std::string>({"abc", "cde", "fgh", "ijk"})); 
    return 0; 
} 
+0

這會在C++ 03中起作用嗎? – user963241 2014-10-09 13:32:12

+0

@TemplateRex我只是用最少的修改就能完成代碼的工作。我不會那樣編碼。這也沒有錯,它「僅僅」美學上令人震驚。 – luk32 2014-10-09 14:08:18

+0

@ user963241不,它不會。列表初始化(即「花式大括號內容」)是在C++ 11中引入的。在C++ 03中,只有可以使用列表初始化的東西是標量和[普通舊數據類型](http://en.cppreference.com/w/cpp/concept/PODType),所以你必須像Devaish手動顯示或「push_back」一切。我不認爲用C++ 11做一些漂亮而高效的東西是不可能的,這應該不是問題。任何半現代編譯器都應該已經支持它。 – luk32 2014-10-09 14:16:53

1

對於重複串的載體,可以使用另一構造函數重載採取計數和重複元件:

#include <iostream> 
#include <string> 
#include <vector> 

int main() 
{ 

    std::vector<std::vector<std::string>> vec 
    (
     3, { "abc", "cde", "fgh", "ijk" } 
    ); 

    for (v : vec) { 
     for (s : v) 
      std::cout << s << ","; 
     std::cout << "\n"; 
    } 
} 

Live Example

+0

這個應該使用'()'作爲外部向量,不是嗎?因爲你正在調用一個不帶'initializer_list'的構造函數。 – 2014-10-09 13:10:32

+0

@BenVoigt不,它的工作原理(添加了實例),因爲不能爲* outer *向量推導出initializer_list。對於內部向量,它確實推演了initializer_list。 – TemplateRex 2014-10-09 13:11:35

+0

是的,我用「應該」的意思是「更好的風格」,而不是「編譯需要」。 – 2014-10-09 13:13:39

0

另外一個(甚至對於之前C++ 11 ):

int main() { 
    std::vector<std::vector<std::string> > vec; 
    std::string aa[] = {"abc", "cde", "fgh", "ijk"}; 
    std::vector<std::string> vec1(aa, aa+sizeof(aa)/sizeof(std::string)); 

    vec.push_back(vec1); 
    vec.push_back(vec1); 
    vec.push_back(vec1); 
    return 0; 
} 
+0

是的,但需要您事先創建陣列的副本。 – user963241 2014-10-09 13:31:33