我花了很多时间来寻找错误的原因。
下面是我的一个c ++程序,它使用vector来存储数据。我已经看到,当vector
增加自我大小时,所有引用都会发生变化。因此,push_back()
对象保存对back()
对象的引用是愚蠢的,没有意义。
class Test{
public :
int wiek;
};
int main(int argc, char **argv)
{
std::vector<Test> v;
std::vector<Test*> vv;
for (int i = 0; i < 12; i++) {
Test t;
t.wiek = 10;
v.push_back(t);
vv.push_back(&v.back());
}
Test& m = v.back();
for (int i = 0; i < 24; i++) {
Test t;
t.wiek = 123;
v.push_back(t);
vv.push_back(&v.back());
}
for (int i = 0; i < 36; i++) {
std::cout<<"vv.at(i)->wiek : "<<vv.at(i)->wiek<<"\n";
}
// vv.at(i)->wiek : 1619638984
// vv.at(i)->wiek : 167838876
// vv.at(i)->wiek : 167838896
// vv.at(i)->wiek : 167838900
// vv.at(i)->wiek : 167839152
// vv.at(i)->wiek : 167839156
// vv.at(i)->wiek : 167839160
// vv.at(i)->wiek : 167839164
// vv.at(i)->wiek : 167838872
// vv.at(i)->wiek : 167838876
// vv.at(i)->wiek : 167838880
// vv.at(i)->wiek : 167838884
// vv.at(i)->wiek : 167838888
// vv.at(i)->wiek : 167838892
// vv.at(i)->wiek : 167838896
// vv.at(i)->wiek : 167838900
// vv.at(i)->wiek : 123
// vv.at(i)->wiek : 123
// vv.at(i)->wiek : 123
// vv.at(i)->wiek : 123
// vv.at(i)->wiek : 123
// vv.at(i)->wiek : 123
// vv.at(i)->wiek : 123
// vv.at(i)->wiek : 123
// vv.at(i)->wiek : 123
// vv.at(i)->wiek : 123
// ...
//
return 1;
}
我有权利吗?
答案 0 :(得分:1)
如果您需要一个允许随机访问的容器,并且保证在容器增长时项目引用不会失效,请使用std::deque
。
答案 1 :(得分:0)
正确,你对你的矢量做的事情并不完全有意义。当你调用push_back()并且向量的大小改变时;有一个自动重新分配整个矢量的存储。因此,以前添加的元素可能不再存在于其原始地址。
快速解决此问题的方法是使用v.resize()预先分配您希望使用的所有索引。所以下面的代码应该可以工作:
Observable.fromEvent(document, 'keydown')
// Now I want to only continue processing the event if the user pressed "o99" in series,
// as in pressed "o", followed by "9" and then another "9"
// I think I can do it with buffer
.buffer(() => Observable.timer(1000))
.map((e) => 'option-99')
// However I need to pass the keys through unbuffered if it's anything but an "o" (unless it is following an "o")
// In other words, "o99" is buffered or something, but "9" is not, and processed immediately
.map((e) => e.keyCode)
但是,如果您不知道最终尺寸是多少。在将所有元素的地址分配给“vv”之前,您必须创建整个“v”向量。