○vectorの検索

■検索で見つかった物を表示

#include <stdio.h>
#include <vector> 
#include <algorithm>
#include <functional>

struct cell{
	int no;
	char str[64];
};

bool find_no(const cell& o) 
{
  return o.no == 3 || o.no == 5;//3か5の場合はtrue
}

int main(){
	std::vector<cell> data;
	cell a;
	a.no = 1;strcpy(a.str,"1です");
	data.push_back(a);
	a.no = 2;strcpy(a.str,"2です");
	data.push_back(a);
	a.no = 3;strcpy(a.str,"3です");
	data.push_back(a);
	a.no = 4;strcpy(a.str,"4です");
	data.push_back(a);
	a.no = 5;strcpy(a.str,"5です");
	data.push_back(a);

	std::vector<cell>::iterator resolt = data.begin();

	resolt=std::find_if(resolt,data.end(),find_no);//find_noにて範囲を指定して検索

	if(resolt!=data.end()){// 終わりで無い=見つかった
		printf("%s\n",resolt[0].str);
	}

	return 0;
}

処理結果
3です

■検索で見つかった物をすべて表示

#include <stdio.h>
#include <vector> 
#include <algorithm>
#include <functional>

struct cell{
	int no;
	char str[64];
};

bool find_no(const cell& o) 
{
  return o.no == 3 || o.no == 5;//3か5の場合はtrue
}

int main(){
	std::vector<cell> data;
	cell a;
	a.no = 1;strcpy(a.str,"1です");
	data.push_back(a);
	a.no = 2;strcpy(a.str,"2です");
	data.push_back(a);
	a.no = 3;strcpy(a.str,"3です");
	data.push_back(a);
	a.no = 4;strcpy(a.str,"4です");
	data.push_back(a);
	a.no = 5;strcpy(a.str,"5です");
	data.push_back(a);

	std::vector<cell>::iterator resolt = data.begin();

	while(data.end()!=(resolt=std::find_if(resolt,data.end(),find_no))){//resoltがdata.end()になるまで回るループ
		printf("%s\n",resolt[0].str);
		resolt++;//検索範囲を1進める
	}
	return 0;
}

処理結果
3です
5です

■二分検索

//二分検索は検索範囲がソートされている必要があります

#include <stdio.h>
#include <vector> 
#include <algorithm>
#include <functional>

struct cell{
	int no;
	char str[64];
};

bool operator==(const cell& left, const cell& right)
{
  return left.no == right.no ;
}

bool operator<(const cell& left, const cell& right)
{
  return left.no < right.no ;
}

int main(){
	std::vector<cell> data;
	cell a;
	a.no = 1;strcpy(a.str,"1です");
	data.push_back(a);
	a.no = 2;strcpy(a.str,"2です");
	data.push_back(a);
	a.no = 3;strcpy(a.str,"3です");
	data.push_back(a);
	a.no = 4;strcpy(a.str,"4です");
	data.push_back(a);
	a.no = 5;strcpy(a.str,"5です");
	data.push_back(a);

	std::sort(data.begin(),data.end());//昇順ソート

	a.no=10;
	bool f=std::binary_search(data.begin(),data.end(),a);//二分検索 見つかればtrue
	if(f) printf("存在します\n"); else printf("存在しません\n");

	return 0;
}

処理結果
存在しません



▲トップページ > Windows と C++