- 締切済み
ベクターの初歩について
ベクターについて勉強し始めた所です。ベクターについて解らない事があるので教えて下さい。 今ベクターに10個数字を登録します。 後で3か5があれば取り除きます。 #include <vector> #include <iostream> int main(){ using namespace std; vector<int> array1; for( int i = 0; i < 10; ++i ) array1.push_back( i ); vector<int>::iterator it; for(it = array1.begin(); it != array1.end(); ){ if(*it == 3 || *it==5) it = array1.erase(it); else ++it; } for( it = array1.begin(); it != array1.end(); ++it ) cout << *it << endl; return 0; } 一応出来たんですが、これが構造体だったらどうしたらいいのでしょう? typedef struct{ int x,y; }xy_t; vector<xy_t> array1; だとして、最初にx,yのそれぞれ10個に適当な値を入れておき、xが3か5ならそれを削除するにはどうしたらいいのでしょうか。 また、一つずつ削除する方法と、remove関数で出来そうな気がするので、もし一括で出来る方法があればそちらも2種類お願いします。 (構造体を用いたベクターの使い方が書いてある参考サイトでも結構です) XP Pro VS2005Pro よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- croaker
- ベストアンサー率37% (6/16)
typedef struct { int x, y; } xy_t; class CSample { public: // 叙述関数 bool operator()(const xy_t& obj) { return (obj.x == 3 || obj.x == 5); } }; int main() { using namespace std; vector<xy_t> array1; for (int i = 0; i < 10; ++i) { xy_t elem; elem.x = i; elem.y = i; array1.push_back(elem); } vector<xy_t>::iterator end_it = remove_if(array1.begin(), array1.end(), CSample()); array1.erase(end_it, array1.end()); return 0; } vectorにクラスを入れる方法を解説しているページですが、どうでしょうか? http://www5c.biglobe.ne.jp/~ecb/cpp/07_07.html
- sakusaker7
- ベストアンサー率62% (800/1280)
申し訳ない。#1での例は恥ずかしい間違いしてました。 コンパイルしてみりゃ一発でわかるのにねえ >よくわからないです・・。 余計な時間を取らせて全く申し訳ない。 今回は動作確認してます。 #include <vector> #include <iostream> #include <algorithm> #include <functional> struct Point { int x; int y; }; static bool pred(Point v) { if (v.x == 3 || v.x == 5) return true; else return false; } int main() { std::vector<Point> array1; for (int i = 0; i < 10; ++i) { Point p; p.x = i; p.y = i*2; array1.push_back(p); } std::vector<Point>::iterator it; #ifdef METHOD1 for (it = array1.begin(); it != array1.end(); ){ if((*it).x == 3 || (*it).x==5) it = array1.erase(it); else ++it; } #else array1.erase( std::remove_if(array1.begin(), array1.end(), std::ptr_fun(pred)), array1.end()); #endif for (it = array1.begin(); it != array1.end(); ++it) std::cout << (*it).x << ", " << (*it).y << std::endl; return 0; } > http://www.geocities.jp/ky_webid/cpp/library/021.html > こちらを見ながらremove_if関数で何とか消せないかと思っているのですが もう一つ申し訳ない。 このページを今見られないので、アドバイスできません。 > 独習C++を見ても、はじめてのC++を見ても、 > ネットを見ても構造体を使ったサンプルが載って無いのですが、 > どこで勉強すればいいでしょうか・・。 挙げられている二つの本は、書店でパラパラと眺めた程度なのでなんともいえないです。 良いとも悪いとも。 今回の質問にあるような情報だと、C++そのものよりも STLに的を絞った書籍なりの方が良い情報が得られると思います。 といって、今入手できるいい入門書ってなんだろう…
- sakusaker7
- ベストアンサー率62% (800/1280)
#include <vector> #include <iostream> #include <algorithm> #include <functional> struct Point { int x; int y; }; static bool pred(Point v) { if (v.x == 3 || v.y == 5) return true; else return false; } int main() { std::vector<Point> array1; for (int i = 0; i < 10; ++i) { Point p; p.x = i; p.y = i*2; array1.push_back(p); } std::vector<Point>::iterator it; #ifdef METHOD1 for (it = array1.begin(); it != array1.end(); ){ if((*it).x == 3 || (*it).y==5) it = array1.erase(it); else ++it; } #else std::erase(array1.begin(), array1.end(), std::ptr_fun(pred)); #endif for (it = array1.begin(); it != array1.end(); ++it) std::cout << (*it).x << ", " << (*it).y << std::endl; return 0; } std::erase() の第三引数にfunctor 使うのは宿題 :)
お礼
ご回答ありがとう御座います。 なるほど、(*it).xこのようにすればよかったのですね。 eraseの第三引数について調べているのですが、ネットにも独習C++にも載っていないのですみません、よくわからないです・・。 Cの知識しかないのにベクターを使おうとしている為、躓いているところも多いのかと思います。 http://www.geocities.jp/ky_webid/cpp/library/021.html こちらを見ながらremove_if関数で何とか消せないかと思っているのですが、remove_if関数サンプル内のnumの意味が解らなかったりするので、解らず終いです・・。 独習C++を見ても、はじめてのC++を見ても、ネットを見ても構造体を使ったサンプルが載って無いのですが、どこで勉強すればいいでしょうか・・。