我正在尝试制作一个指针 vector ,其元素指向 int 元素 vector 。 (我正在解决一个类似编程的竞争性问题,这就是为什么它听起来有点胡说八道)。
但这是代码:
#include <bits/stdc++.h>
using namespace std;
int ct = 0;
vector<int> vec;
vector<int*> rf;
void addRef(int n){
vec.push_back(n);
rf.push_back(&vec[ct]);
ct++;
}
int main(){
addRef(1);
addRef(2);
addRef(5);
for(int i = 0; i < ct; i++){
cout << *rf[i] << ' ';
}
cout << endl;
for(int i = 0; i < ct; i++){
cout << vec[i] << ' ';
}
}
当我执行代码时,它显示出我无法理解的奇怪行为。 rf ( vector<int*>
) 的第一个元素似乎没有指向 vec 的 ( vector<int>
) 元素,其余元素都指向它。
这是我在 Dev-C++ 上运行它时的输出:
1579600 2 5
1 2 5
当我尝试运行代码时 here ,输出甚至更奇怪:
1197743856 0 5
1 2 5
代码旨在第一行和第二行之间具有相同的输出。
你们能解释一下为什么会这样吗?我的实现有没有错误?
谢谢
最佳答案
使用 push_back
或类似方法将元素添加到 std::vector
可能会使所有迭代器和对其元素的引用无效。参见 https://en.cppreference.com/w/cpp/container/vector/push_back .
想法是为了增长 vector ,它可能没有足够的可用内存来扩展,因此可能必须将整个数组移动到内存中的其他位置,释放旧 block 。这尤其意味着您的指针现在指向已被释放或重新用于其他用途的内存。
如果你想保留这种方法,你将需要 resize()
或 reserve()
vec
中足够数量的元素在开始之前。这当然违背了 std::vector
的全部目的,您不妨改用数组。
https://stackoverflow.com/questions/74312180/