Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用C+中的无序数据填充向量+;_C++_Vector_Size_Insertion - Fatal编程技术网

C++ 用C+中的无序数据填充向量+;

C++ 用C+中的无序数据填充向量+;,c++,vector,size,insertion,C++,Vector,Size,Insertion,我想用(运行时已知)数量的数据填充向量,但元素以(索引、值)对的形式到达,而不是以原始顺序到达。这些索引保证是唯一的(从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) ... myVe

我想用(运行时已知)数量的数据填充向量,但元素以(索引、值)对的形式到达,而不是以原始顺序到达。这些索引保证是唯一的(从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;
向量myVector;
myVector.reserve(n)//数据的总大小是已知的
myVector[i_0]=v_0//数据v_0位于索引i_0(不一定为0)
...
myVector[i_n_减_1]=v_n_减_1;
这似乎在很大程度上起到了很好的作用;在代码末尾,所有n个元素都在向量中的适当位置。然而,有些向量函数并没有像预期的那样工作:

...
cout << myVector.size(); //prints 0, not n!
。。。
cout
myVector.reserve(n)
只是告诉向量为
n
元素分配足够的存储空间,这样当你
将新元素推回
向量时,向量就不必不断地重新分配更多的存储空间——它可能需要多次这样做,因为它事先不知道要插入多少元素。换句话说,你是在帮助向量实现,告诉它一些它不知道的事情,让它更有效

但是reserve实际上并不能使向量
n
长。向量是空的,事实上,像
myVector[0]=something
这样的语句是非法的,因为向量的大小为0:在我的实现中,我得到一个断言失败,“向量下标超出范围”。这是Visual C++ 2012,但我认为GCC类似。 要创建所需长度的向量,只需执行以下操作

vector<Foo> myVector(n);
向量myVector(n);
忘了
保留


(如注释中所述,您还可以调用
resize
来设置向量大小,但在您的情况下,将大小作为构造函数参数传递更简单。)

您需要调用
myVector.resize(n)
来设置(更改)向量大小。调用
reserve
实际上并没有调整向量的大小,它只是使它可以在以后调整大小而无需重新分配内存。写过向量的末尾(正如您在这里所做的——当您写向量时,向量大小仍然是0)是未定义的行为。

这是因为reserve不会调整向量的大小。是否要使用
vector.resize
insteads
Foo
默认可构造?到目前为止的三种解决方案都假设是这样。否则,可能需要存储输入值,然后一次性构造所有的Foo。我认为GCC不会进行相同的检查,因为G++不像VC++那样真正进行
\u DEBUG
构建。在我看来,这是VC++击败G++的一个领域。@MooingDuck谢谢。我原以为gcc会注意到这个实现。我在Windows上使用了多年,直到微软最终采取行动。SGI stl确实提供了检查功能,您必须打开该功能。但正如您所说,您实际上必须手动配置makefiles或任何具有单独调试和发布模式的东西(我确实记得在90年代我使用*nix devmnt时采用这种方式)。gcc与此不同。默认情况下不启用范围检查(请参阅)