こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

2次元vectorのerase?

1行に4つのdouble型の値が書かれているファイルを読み込み、
iを行数として1行ずつphoton[i][0]~photon[i][3]に入れる。
photon[i][0]がある条件を満たしたらphoton[i][1]~photon[i][3]の値を
photon[i-1][1]~photon[i-1][3]と
photon[i+1][1]~photon[i+1][3]に
分けて加算し、photon[i][0]~photon[i][3]は消す(加算後の[i+1]が[i]に来るようにしたい)という作業をしたいのですが、消し方が良く分かりません。
やり方をご存知の方、回答お願いします。
以下のやり方では消えませんでした。vector<double>(4)のほうをeraseしてないからでしょうか。

----------
#include <iostream>
#include <fstream>
#include <string>
#include <list>
#include <vector>
using namespace std;

int main(){
string str;
ifstream ifs("h2o.csv");
ofstream ofs("h2o.txt");
int i = 0;
double sum[3] = {0};
vector< vector<double> > photon(147, vector<double>(4));
double value[4] = {0};

for(;getline(ifs,str); i++){
sscanf(str.c_str(),"%lf,%lf,%lf,%lf", &value[0], &value[1], &value[2], &value[3]);
photon[i][0] = value[0];
photon[i][1] = value[1];
photon[i][2] = value[2];
photon[i][3] = value[3];
sum[0] += value[1];
sum[1] += value[2];
sum[2] += value[3];
}

for(vector< vector<double> >::iterator it = photon.begin(); it != photon.end(); it++){
if( (*it)[0] > 0.1){
cout << "delete!";
it = photon.erase(it);
}
cout << (*it)[0] << endl;
}
}

投稿日時 - 2013-06-24 20:58:18

QNo.8148226

困ってます

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

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

投稿日時 - 2013-06-24 21:37:02

お礼

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

投稿日時 - 2013-06-24 22:02:56

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

erase() は削除した項目の次の項目を指すイテレータを返しますが、ループのインクリメント it++ によって、さらに次(削除された項目の次の次)のイテレータに移ることになります。つまり、削除された項目の次の項目は飛ばされてしまう、ということで。

ところで、erase() の後に書かれている

cout << (*it)[0] << endl;

は、削除された項目の次の項目(の先頭要素)を出力していますが、それは意図したものでしょうか?(ホントは削除されたものの値を知りたかったのでは?)

投稿日時 - 2013-06-24 21:48:28

お礼

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

投稿日時 - 2013-06-24 22:07:22

あなたにオススメの質問