【发布时间】:2016-08-05 00:21:55
【问题描述】:
我在练习 C++ 向量时,在将元素插入 2D 向量时发现了一个问题。在以下示例中:
#include <iostream>
#include <vector>
void fillVector(std::vector<std::vector<int> > &vec) {
std::vector<int> list1;
vec.push_back(list1);
list1.push_back(1);
list1.push_back(2);
std::vector<int> list2;
list2.push_back(3);
list2.push_back(4);
vec.push_back(list2);
return;
}
int main() {
std::vector<std::vector<int> > vect;
fillVector(vect);
std::cout << "vect size: " << vect.size() << std::endl;
for(int i = 0; i < vect.size(); i++) {
std::cout << "vect in size: " << vect.at(i).size() << std::endl;
}
}
第一个inner-list的大小为0,第二个inner-list的大小为2。list1和list2的唯一区别是list1先插入vec 2D 向量,在元素被插入之前,而元素首先被插入到list2,然后它本身被插入到 2D 向量中。函数返回后,插入list1的元素不打印,大小不变。
我也尝试了第一种方法,而不是指针,
std::vector<int> *list3 = new std::vector<int>();
vec.push_back(*list3);
list3->push_back(5);
list3->push_back(6);
但是,从调用函数读取时 list3 的大小仍然为 0。 我不明白这两种方法之间的区别。为什么插入元素后必须追加列表?
【问题讨论】:
-
在第一种情况下,您需要将
list1.push_back(1); list1.push_back(2);更改为vec.back().push_back(1); vec.back().push_back(2);否则您只需将项目添加到list1而不是vec。 -
顺便说一句,您的第三个解决方案(指针)基本上不起作用,原因与第一个案例不起作用的原因相同,因为您
push_back()取消引用list3(只是 list3 的值) . -
扩展@DimChtz 评论:当您将某些内容放入
vector时,vector会存储一个副本。操作原件不会影响副本。