我希望用(在运行时已知的)数据量填充向量,但元素以(索引,值)对而不是原始顺序到达。这些索引保证是唯一的(每个索引从0到n-1只出现一次)所以我想按如下方式存储它们:
vector<Foo> myVector;
myVector.reserve(n); //total size of data is known
myVector[i_0] = v_0; //data v_0 goes at index i_0 (not necessarily 0)
...
myVector[i_n_minus_1] = v_n_minus_1;
这似乎在大多数情况下都能正常工作;在代码的末尾,所有n个元素都在向量中的适当位置。但是,某些向量函数并没有按预期工作:
...
cout << myVector.size(); //prints 0, not n!
对我来说,像size()
这样的函数仍然有效非常重要 - 我可能想检查一下,如果通过检查size() == n
是否已成功插入所有元素。我是否错误地初始化了向量,如果是这样,我该如何处理呢?
答案 0 :(得分:5)
myVector.reserve(n)
只是告诉向量为n
元素分配足够的存储空间,这样当你将push_back
个新元素放入向量时,向量就不必再连续重新分配更多的存储空间 - 它可能不止一次这样做,因为它事先不知道你要插入多少元素。换句话说,你通过告诉它不会知道的东西并允许它更高效来帮助实现矢量实现。
但保留实际上并不会使向量长n
。向量是空的,事实上像myVector[0] = something
这样的语句是非法的,因为向量的大小为0:在我的实现中,我得到一个断言失败,“向量下标超出范围”。这是在Visual C ++ 2012上,但我认为gcc是类似的。
要创建所需长度的矢量,只需执行
vector<Foo> myVector(n);
忘了reserve
。
(如评论中所述,您也可以调用resize
来设置矢量大小,但在您的情况下,将大小作为构造函数参数传递会更简单。)
答案 1 :(得分:3)
您需要调用myVector.resize(n)
来设置(更改)向量的大小。调用reserve
实际上并没有调整向量的大小,只是调整它以便稍后调整大小而不重新分配内存。写过矢量的结尾(正如你在这里做的那样 - 当你写入时矢量大小仍为0)是未定义的行为。