• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:2次元vectorのerase?)

2次元vectorのerase?

このQ&Aのポイント
  • 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]は消したいです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

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; }

honor
質問者

お礼

回答ありがとうございます。 その例に倣ってやったら上手くいきました。

その他の回答 (1)

回答No.2

erase() は削除した項目の次の項目を指すイテレータを返しますが、ループのインクリメント it++ によって、さらに次(削除された項目の次の次)のイテレータに移ることになります。つまり、削除された項目の次の項目は飛ばされてしまう、ということで。 ところで、erase() の後に書かれている cout << (*it)[0] << endl; は、削除された項目の次の項目(の先頭要素)を出力していますが、それは意図したものでしょうか?(ホントは削除されたものの値を知りたかったのでは?)

honor
質問者

お礼

回答ありがとうございます。 飛ばされていれば削除できていると判断するつもりだったので、削除された項目は飛ばすように書きました。

関連するQ&A