- ベストアンサー
2次元vectorのerase?
- 2次元vectorのeraseについての質問です。
- 1行に4つのdouble型の値が書かれているファイルを読み込み、専門[i][0]~photon[i][3]に入れる作業をしたいです。
- photon[i][0]がある条件を満たしたら、photon[i][1]~photon[i][3]の値を他のベクトルに分けて加算し、photon[i][0]~photon[i][3]は消したいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
vector<int> { 0, 1, 2, 3, 4, ... } から偶数を削除するサンプル #include <iostream> #include <vector> #include <algorithm> #include <numeric> using namespace std; int main() { const int N = 100; /* ダメな消し方 --- vector<int> bad(N); iota(begin(bad), end(bad), 0); for ( vector<int>::iterator it = begin(bad); it != end(bad); ++it ) { if ( *it % 2 == 0 ) { it = bad.erase(it); } } for ( int i = 0; i < bad.size(); ++i ) { cout << bad[i] << ' '; } cout << endl; */ vector<int> good(N); iota(begin(good), end(good), 0); good.erase(remove_if(begin(good), end(good), [](int n) { return n % 2 == 0;}), end(good)); for ( int i = 0; i < good.size(); ++i ) { cout << good[i] << ' '; } cout << endl; }
その他の回答 (1)
- fresh_homepie
- ベストアンサー率64% (24/37)
erase() は削除した項目の次の項目を指すイテレータを返しますが、ループのインクリメント it++ によって、さらに次(削除された項目の次の次)のイテレータに移ることになります。つまり、削除された項目の次の項目は飛ばされてしまう、ということで。 ところで、erase() の後に書かれている cout << (*it)[0] << endl; は、削除された項目の次の項目(の先頭要素)を出力していますが、それは意図したものでしょうか?(ホントは削除されたものの値を知りたかったのでは?)
お礼
回答ありがとうございます。 飛ばされていれば削除できていると判断するつもりだったので、削除された項目は飛ばすように書きました。
お礼
回答ありがとうございます。 その例に倣ってやったら上手くいきました。