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

締切り済みの質問

ベクターの初歩について

ベクターについて勉強し始めた所です。ベクターについて解らない事があるので教えて下さい。
今ベクターに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

よろしくお願いします。

投稿日時 - 2008-03-31 04:54:59

QNo.3909243

すぐに回答ほしいです

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

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

回答(3)

ANo.3

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

投稿日時 - 2008-04-02 09:47:39

ANo.2

申し訳ない。#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に的を絞った書籍なりの方が良い情報が得られると思います。
といって、今入手できるいい入門書ってなんだろう…

投稿日時 - 2008-03-31 13:40:14

ANo.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.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 使うのは宿題 :)

投稿日時 - 2008-03-31 09:22:56

お礼

ご回答ありがとう御座います。
なるほど、(*it).xこのようにすればよかったのですね。
eraseの第三引数について調べているのですが、ネットにも独習C++にも載っていないのですみません、よくわからないです・・。
Cの知識しかないのにベクターを使おうとしている為、躓いているところも多いのかと思います。
http://www.geocities.jp/ky_webid/cpp/library/021.html
こちらを見ながらremove_if関数で何とか消せないかと思っているのですが、remove_if関数サンプル内のnumの意味が解らなかったりするので、解らず終いです・・。

独習C++を見ても、はじめてのC++を見ても、ネットを見ても構造体を使ったサンプルが載って無いのですが、どこで勉強すればいいでしょうか・・。

投稿日時 - 2008-03-31 12:11:04