一次性创建和初始化一个向量数组

4
为了创建一个字符串数组,可以这样做:

std::string array[] = {
    "first",
    "second",
    :
    "last"
};

如果我尝试使用向量做同样的事情,它不起作用:

std::vector<int> array[] = {
    {1, 2},
    {3, 4, 5}
    :
    {9}
};

我收到了“非聚合体不能用初始化列表初始化”的错误提示。

请问正确的语法是什么,以初始化向量数组?

请注意,我需要一次性完成这个操作,并且不能使用向量成员函数逐个填充向量中的int(因为我正在尝试设置一个文件,在编译时基于初始化数字创建数组,所以在这种情况下调用成员函数没有帮助)。

4个回答

2
尽管使用向量数组的目的很值得怀疑(为什么不使用向量的向量或二维数组呢?),但要实现您想要的功能,正确的语法应该是:
std::vector<int> array[] = {
    vector<int>(2),
    vector<int>(3),
    //...
    vector<int>(1)
};

这个说法没有任何意义,因为在这种情况下,它在语义上与创建指针数组是相同的:

int* array[] = {
        new int[0],
        new int[0],
        //...
        new int[0],
    };

唯一的区别是,内部std::vector自行管理这些指针的生命周期。这意味着,除非您创建一个常量大小的向量(即,没有向量重新分配内部存储器的可能性,如果您声明向量为const或确保永远不调用resize、reserve、push_back、insert、erase等类似方法),否则您将获得实际上是带有指针的小对象数组。这通常是如何实现向量的。

你所说的在编译时创建数组并不清楚。以您尝试做的方式声明的数组,以及这些数组:

int fixed_size_array[100];

确实,某些对象在编译时大小已经确定,但是向量是不同的 -- 这些是复杂的C++对象,在运行时动态管理其内存,这意味着它们不能通过设计具有编译时固定的大小。


1
长话短说,它就是不被支持。有各种变通方法可以获得类似的语法(例如Boost::assign),但这些方法并不改变可执行文件中的结果——它们只是使调用成员函数比一系列push_back调用更简单一些。

1
也许像这样的东西会带你走向你想要的方向?
const int arr[] = { 1, 2, 3, 4, 5 };

std::vector v( arr, arr + sizeof(arr) / sizeof(*arr) );

0
创建一个向量的向量代码。
std::vector< std::vector< int > > v;

调用默认的无参构造函数 创建一个简单的 int 向量

int arry[] = {1,2,3,4,5};
std::vector< int > list(arry, arry + sizeof(arry) / sizeof(int));

因此,从整数数组构建向量,我建议您在您的情况下使用push_back()方法。

但是,如果您只想要粗略地操作,可以按照上述方式创建一个std::vector< int >数组,并将其传递给std::vector< std::vector< int > >的构造函数。

请查看http://www.cplusplus.com/reference/stl/vector/vector/以获取更多信息。您可能会对这个特定的构造函数重载感兴趣:template <class InputIterator> vector ( InputIterator first, InputIterator last, const Allocator& = Allocator() );

Neel


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接