-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 に答える