一次创建并初始化一组向量

时间:2010-06-17 18:46:11

标签: c++ vector

要创建一个字符串数组,这可以工作:

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

如果我尝试对矢量执行相同操作,则无效:

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

我得到“非聚合不能用初始化列表初始化”。

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

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

4 个答案:

答案 0 :(得分: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 :(得分:1)

总而言之,它根本不受支持。有各种变通方法来获得类似的语法(例如Boost :: assign)但这些并没有改变你在可执行文件中得到的东西 - 它们只是调用成员函数比一串字符串更简单致电push_back

答案 2 :(得分:1)

也许这样的事情会带你走向你想要的方向?

const int arr[] = { 1, 2, 3, 4, 5 };

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

答案 3 :(得分: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));

从而构造了一个来自Integer数组的向量 我建议您在场景中使用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() );

感兴趣

尼尔