1

以下に提供される小さなテストコードと出力を見てください。ループ内の std::vector で push_back() を使用すると、C++ はメモリを「ランダムな」アドレスに割り当て、ループの終了後にデータを連続したメモリ アドレスに再コピーするようです。

これは、ループの前にベクトルのサイズがわからないという事実と関係がありますか?

テスト コードで行うことの正しい方法は何ですか? 最初のループが終了した後、別のループでポインターを割り当てる必要がありますか? 最初のループの前にベクトルのサイズを定義できないことに注意してください。実際には、初期化が必要なクラス オブジェクトのベクトルであるためです。

ご協力ありがとうございました。

std::vector<int> MyVec;
std::vector<int *> MyVecPtr;

for (int i = 0; i < 10; i++)
{
    MyVec.push_back(i);

    MyVecPtr.push_back(&MyVec.back());

    std::cout << MyVec.back() << " " 
              << &MyVec.back() << " "
              << MyVecPtr.back() << " "
              << *MyVecPtr.back() << std::endl;
}

std::cout << std::endl;

for (int i = 0; i < MyVec.size(); i++)
{
    std::cout << MyVec[i] << " " 
              << &MyVec[i] << " "
              << MyVecPtr[i] << " "
              << *MyVecPtr[i] << std::endl;
}

0 0x180d010 0x180d010 0
1 0x180d054 0x180d054 1
2 0x180d038 0x180d038 2
3 0x180d03c 0x180d03c 3
4 0x180d0b0 0x180d0b0 4
5 0x180d0b4 0x180d0b4 5
6 0x180d0b8 0x180d0b8 6
7 0x180d0bc 0x180d0bc 7
8 0x180d140 0x180d140 8
9 0x180d144 0x180d144 9

0 0x180d120 0x180d010 25219136
1 0x180d124 0x180d054 0
2 0x180d128 0x180d038 2
3 0x180d12c 0x180d03c 3
4 0x180d130 0x180d0b0 4
5 0x180d134 0x180d0b4 5
6 0x180d138 0x180d0b8 6
7 0x180d13c 0x180d0bc 7
8 0x180d140 0x180d140 8
9 0x180d144 0x180d144 9
4

1 に答える 1

1

実行する挿入の数がわかっている場合は、それに応じreserve()て on を使用する必要がありますvector。これにより、容量を超えたときに実行されるサイズ変更の必要がなくなります。

MyVec.reserve(10);
for (int i = 0; i < 10; i++)
{
    MyVec.push_back(i);
    //...
于 2013-10-01T23:52:19.307 に答える