私はC++ベクトルで練習していましたが、要素を2Dベクトルに挿入するときに問題が見つかりました。次の例で:C++で2Dベクトルに要素を挿入する順序
#include <iostream>
#include <vector>
void fillVector(std::vector<std::vector<int> > &vec) {
std::vector<int> list1;
vec.push_back(list1);
list1.push_back(1);
list1.push_back(2);
std::vector<int> list2;
list2.push_back(3);
list2.push_back(4);
vec.push_back(list2);
return;
}
int main() {
std::vector<std::vector<int> > vect;
fillVector(vect);
std::cout << "vect size: " << vect.size() << std::endl;
for(int i = 0; i < vect.size(); i++) {
std::cout << "vect in size: " << vect.at(i).size() << std::endl;
}
}
第一インナーリストのサイズが0であり、及び第2の内部リストのサイズはlist1
とlist2
との間の唯一の違いはlist1
が最初に挿入されることである2です。 vec
要素が挿入される前の2Dベクトル。最初に要素がlist2
に挿入されてから、2Dベクトルに挿入されます。関数から戻ると、list1
に挿入された要素は印刷されず、そのサイズは変わりません。
私はまた、ポインタを持つ第一の方法ではなく、
std::vector<int> *list3 = new std::vector<int>();
vec.push_back(*list3);
list3->push_back(5);
list3->push_back(6);
しかし、呼び出し元の関数から読み取るLIST3のサイズは依然として0 である私は2つのアプローチの違いを理解していない試みました。要素が挿入された後にリストを追加する必要があるのはなぜですか?
最初に、 'list1.push_back(1);を変更する必要があります。 list1.push_back(2); 'to' vec.back()。push_back(1); vec.back()。push_back(2); 'そうでなければ' vec'ではなく 'list1'に項目を追加するだけです。 – DimChtz
Btw、 'list3'の逆参照(list3の値だけ)を' push_back() 'するので、あなたの3番目の解決法(ポインタ)は本質的に機能しません。 – DimChtz
@DimChtzコメントで展開: 'vector'に何かを入れると、' vector'はコピーを保存します。オリジナルを操作することはコピーに何の影響も与えません。 – user4581301