vector<list<int>>のデータ削除

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
keito
記事: 33
登録日時: 3年前

vector<list<int>>のデータ削除

#1

投稿記事 by keito » 2年前

C++についてです(知識は入門書程度の内容なら大体理解できる位)
vector<list<int>> foo = { {1}, {2,3,4,5},{6,7,8},{9,10} }というデータがあったとして
それから4を探し出して削除するとします

コード:

#include<vector>
#include<list>
#include<iterator>
using namespace std;

int main() {
	vector<list<int>> foo = { {1}, {2,3,4,5},{6,7,8},{9,10} };
	for (auto f_it = cbegin(foo); f_it != cend(foo); ++f_it) {
		for(auto s_it = cbegin(*f_it); s_it != cend(*f_it); ++s_it) {
			if (*s_it == 4)s_it.erase(s_it); //Error
		}
	}
	return 0;
}
上のコードは自分で考えたものですが、list::eraseで削除する処理でエラーが起きてしまいます…
これ以上考えても正しいコードが分からないのでどのように書き換えるべきか教えてもらえると助かります

アバター
usao
記事: 1564
登録日時: 6年前

Re: vector<list<int>>のデータ削除

#2

投稿記事 by usao » 2年前

オフトピック
最近のC++だと,eraseの引数にconst_iteratorってのはOKになったんですか?
(iteratorに変えても死にそうなコードだが)

かずま

Re: vector<list<int>>のデータ削除

#3

投稿記事 by かずま » 2年前

keito さんが書きました: 上のコードは自分で考えたものですが、list::eraseで削除する処理でエラーが起きてしまいます…
これ以上考えても正しいコードが分からないのでどのように書き換えるべきか教えてもらえると助かります
コンパイラがエラーメッセージで、どこがどう間違っているのかを教えて
くれるので助かるはずです。エラーメッセージはなんと出ましたか?

erase は list のメンバ関数です。
s_it は、iterator であって、list ではありません。
*f_it が list ですから、(*f_it).erase、すなわち
f_it->erase と書きましょう。

vector の要素である {2,3,4,5} を {2,3,5} にしたいのですよね。
cbegin で取得した f_it は const_iterator なので、
vector の要素である list を変更できません。
cbegin を begin に、cend を end に修正しましょう。

s_it の指す要素を erase したら、s_it はもう使えません。
for文の ++s_it を削除し、次のようにしましょう。

コード:

    if (*s_it == 4)
        s_it = f_it->erase(s_it);
    else
        ++s_it;

keito
記事: 33
登録日時: 3年前

Re: vector<list<int>>のデータ削除

#4

投稿記事 by keito » 2年前

無事解決しました!ありがとうございます
const_iteratorは確かに不味いですね…(中途半端な知識で知らなかった)

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: vector<list<int>>のデータ削除

#5

投稿記事 by ISLe » 2年前

オフトピック
解決しちゃってたけどせっかくだから投稿します。

コード:

#include <vector>
#include <list>
#include <algorithm>
#include <iostream> // for DEBUG

int main()
{
    std::vector<std::list<int>> foo = { {1},{2,3,4,5},{6,7,8},{9,10} };
    for (auto &l : foo) {
        l.erase(remove_if(begin(l), end(l), [](int i)->bool { return i == 4; }), end(l));
    }
#if 1  // for DEBUG
    for (auto &l : foo) {
        for (auto &i : l) { std::cout << i << ' '; }
        std::cout << std::endl;
    }
#endif
    return 0;
}

返信

“C言語何でも質問掲示板” へ戻る