私はまず、vector
のstring
をtest
と宣言します。それから私はstring
Hello
とWorld
を一backとa
がtest
にreference
a
test[0]
の.ANDその後、私は一backをすることができます。しかし、私はa
をpush_backの前と後にそれぞれ印刷し、test
にプッシュした後にはa
が何もなかったことを観察しました。なぜa
は何になりませんか?その要素のreference
(a)
を自分自身にプッシュバックする際に、ベクターはどのように機能しますか? a
はreference
のtest[0]
ではなくなりましたか?
ありがとうございます。要素の参照を自身にプッシュバックしている間、ベクターはどのように機能しますか?
備考:push_back test[0]
の場合、a
も何も表示されません。しかしtest[0]
はまだ "こんにちは"です。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
vector<string> test;
test.push_back("Hello");
test.push_back("World");
string& a = test[0];
cout << "1"<< a << "\n";
test.push_back(a); //or : test.push_back(test[0]);
cout << "2"<< a << "\n";
}
出力:
1Hello
2
アップデート:私はそれを得た
、以下の回答やコメントへの感謝。私はsize
とcapacity
をtest
と書いてあり、両方が2
であることを観察しました。 test.push_back(a)
を実行すると、ベクトルtest
は新しいメモリを割り当て、古い要素を新しいメモリにコピーします。従って、a
、その古い要素の参照は、未定義となる。
reserve
を使用した同様のコードです。 a
が未定義になる理由は私の元の質問と同じだと思います。 (私が間違っているなら、私に教えてください。)
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
vector<string> test;
test.push_back("Hello");
test.push_back("World");
string& a = test[0];
cout << "1"<< a << "\n";
cout << "size:" << test.size() << " capacity:" <<test.capacity() <<"\n";
test.reserve(3);
cout << "2"<< a << "\n";
}
出力:
1Hello
size:2 capacity:2
2
'push_back'のすべてのイテレータ、ポインタ、およびベクトル要素への参照は無効になります(あなたがテストしなかったいくつかのケースを除いて) –