2014-10-09 86 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