Cpp重新定位矢量

时间:2017-04-05 16:36:21

标签: c++

我花了很多时间来寻找错误的原因。 下面是我的一个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;
}

我有权利吗?

2 个答案:

答案 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”向量。