-1

在下面的代码中,每当将新成员插入 时std::vector<int>A,由于内存重新分配,都会std::vector<reference_wrapper<int>>B指向错误的地址。是否可以使引用向量跟踪重新分配并始终存储正确的地址?

#include <iostream>
#include <functional>
#include <vector>
using namespace std;

int main()
{
    vector<int> A (0,3);
    vector<reference_wrapper<int>> B;
    B.push_back ( ref(A[0]) );
    B.push_back ( ref(A[1]) );
    B.push_back ( ref(A[2]) );

    A.push_back (0);

    cout << &A[0] << endl;
    cout << &B[0].get() << endl;

    return 0;
}
4

2 回答 2

1

我看到的唯一方法是为向量保留足够的内存,如果您不在向量中间删除或插入元素,则在推回新元素时不会重新分配它。

考虑到这个声明

vector<int> A (0,3);

是错的。

必须有

vector<int> A (3,0);

或者干脆

vector<int> A (3);

你可以写

#include <iostream>
#include <functional>
#include <vector>
using namespace std;

int main()
{
    vector<int> A( 3 );
    A.reserve( 4 );

    vector<reference_wrapper<int>> B;

    B.push_back ( ref(A[0]) );
    B.push_back ( ref(A[1]) );
    B.push_back ( ref(A[2]) );

    A.push_back (0);

    cout << &A[0] << endl;
    cout << &B[0].get() << endl;

    return 0;
}

输出看起来像

0x9cbd018
0x9cbd018
于 2014-09-01T10:19:09.000 回答
0

您没有指定此模式的实际用法。所以这里有一些可能的解决方案:

  1. 存储索引而不是引用/迭代器。
  2. 将 A 更改为不会使迭代器无效的列表或双端队列,而不是实际更改的迭代器。
  3. 动态分配所有整数(例如std::shared_ptr<int>)并让 A 和 B 都存储(共享)指针。
于 2014-09-01T10:58:18.830 回答