C++マップとセットの応用(詳細説明)

目次

1. 連想コンテナ

2. キーと値のペア

3.セット

4. マルチセット

5.地図

6. マルチマップ


1. 連想コンテナ

 

2. キーと値のペア

1 対 1 に対応する構造体を表すために使用されます。この構造体には通常、メンバー変数 key と value の 2 つだけが含まれます。Key はキーの値を表し、value はキーに対応する情報を表します。

意味:

template <class T1, class T2>
struct pair
{
typedef T1 first_type;
typedef T2 second_type;
T1 first;
T2 second;
pair(): first(T1()), second(T2())
{}
pair(const T1& a, const T2& b): first(a), second(b)
{}
};

 

 

3.セット

a.set は要素を一定の順序で格納するコンテナであり、この順序で set のイテレータを使用してセット内の要素を走査することで、順序付けられたシーケンスを取得できます。

注:map/multimap とは異なり、map/multimap は実際のキーと値のペア <key, value> を格納し、値のみがセットに配置されますが、<value, value> で構成されるキーと値のペアは実際には底。

b. セットでは、要素の値によっても識別されます (値はキーで、型は T)。要素をセットに挿入するときは、値を挿入するだけで済みます。キーを作成する必要はありません。 -value ペアであり、各値は一意である必要があります (set を使用して重複を削除できます)。

注: セット内の要素はコンテナ内で変更できません (要素は常に const であり、変更によってデータの順序は保証されません) が、コンテナに対して挿入または削除することはできます。

c. 内部的には、セット内の要素は、内部比較オブジェクト (型比較) によって示される特定の厳密で弱い並べ替え基準に従って常に並べ替えられます。それは昇順です。

d.set コンテナは一般に、キーによる個々の要素へのアクセスが unowned_set コンテナよりも遅くなりますが、順序に基づいてサブセットを直接反復できます。

e.set は、最下位レベルで二分探索ツリー (赤黒ツリー) を使用して実装されます。

構築セット 

void testset1()
{
	set<int> set1;//空构造
	int num[] = { 4,5,1,8,2,4,6,3 };
	set<int> set2(num, num+sizeof(num)/sizeof(num[0]));//对于数组使用原生指针构造
	set<int> set3(set2);//拷贝构造
	// 范围for打印,从打印结果中可以看出:set可去重
	for (auto& e : set3)
		cout << e << " ";
	cout << endl;
}

 

void testset2()
{
	int num[] = { 4,5,1,8,2,4,6,3 };
	set<int> set1(num, num + sizeof(num) / sizeof(num[0]));//对于数组使用原生指针构造
	// 范围for打印,从打印结果中可以看出:set可去重
	for (auto& e : set1)
		cout << e << " ";
	cout << endl;
	//迭代器正向遍历
	auto it1 = set1.begin();
	while (it1 != set1.end())
	{
		cout << *it1 << " ";
		it1++;
	}
	cout << endl;
	//迭代器反向遍历
	auto it2 = set1.rbegin();
	while (it2 != set1.rend())
	{
		cout << *it2 << " ";
		it2++;
	}
}

 

 設定容量:

セットの変更:

 

void testset3()
{
	int num[] = { 1,8,4,5,3,9,2,6,7,4,5 };
	set<int> set;
	for (int e : num)//插入
	{
		auto ret=set.insert(e);
		if (ret.second == false)
			cout << e << "插入失败" << endl;
	}
	for (auto& e : set)//遍历
		cout << e << " ";
	cout << endl;
	cout << "count 5:" << set.count(5) << endl;
	set.erase(set.find(8));//删除
	for (auto& e : set)
		cout << e << " ";
	cout << endl;
}

 

4. マルチセット

マルチセット コンテナとセット コンテナの実装とインターフェイスは基本的に同じですが、唯一の違いは、マルチセットではキー値の冗長性、つまりマルチセット コンテナに格納される要素を繰り返すことができることです。

注: find の場合、multiset は、基になる検索ツリーの順序でキー値が key である最初の要素のイテレータを返します。

void TestMSet()
{
	int array[] = { 2, 1, 2, 1, 6, 0, 1, 6, 4, 7 };
	// 允许键值冗余
	multiset<int> s(array, array + sizeof(array) / sizeof(array[0]));
	for (auto& e : s)
		cout << e << " ";
	cout << endl;
}

 

5.地図

a. マップは連想コンテナであり、キーと値で構成される要素を特定の順序 (キーで比較) で格納します。

b. マップでは、キー値キーは通常、要素を並べ替えて一意に識別するために使用され、値値にはこのキー値キーに関連付けられたコンテンツが格納されます。キーと値の型は異なる場合があり、マップ内では、キーと値はメンバー型 value_type を通じてバインドされており、それらの別名は、pair:typedef ペア value_type です。

c. 内部マップ内の要素は、常にキー値に従って比較、並べ替え、および検索されます。

d. 通常、マップ内のキー値を介して単一の要素にアクセスする速度は、unowned_map コンテナーの速度よりも遅くなりますが、マップでは順序に従って要素を直接反復できます (つまり、マップ内の要素を反復するときに、順序付けされたマップを取得できます)順序)

e.map は添字アクセサーをサポートしています。つまり、キーを [] に入れることで、キーに対応する値を見つけることができます (挿入時のラッパーがここにあります)。

f.map は通常、二分探索ツリー (より正確には、平衡二分探索ツリー (赤黒ツリー)) として実装されます。

void testmap1()
{
	map<int, int> map1;//空构造
	int num[] = { 1,5,9,4,8,2,3,1,5,4,5,7 };
	for (auto e : num)
	{
		map1.insert(make_pair(e,e));
	}
	map<int, int> map2(map1.begin(),map1.end());//迭代区间构造
	map<int, int> map3(map2);//拷贝构造
	for (auto& e : map3)
	{
		cout << e.first << ":" << e.second << endl;
	}
}

マップ反復子:

 

 

void testmap2()
{
	map<int, int> map1;//空构造
	int num[] = { 1,5,9,4,8,2,3,1,5,4,5,7 };
	for (auto e : num)
	{
		//map1.insert(pair<int,int>(e, e));
		map1.insert(make_pair(e, e));//等同于
	}
	//迭代器正向遍历
	auto it1 = map1.begin();
	while (it1 != map1.end())
	{
		//cout << (*it1).first << ":"<<(*it1).second<<endl;
		cout << it1->first << ":"<<it1->second<<endl;//等同于
		it1++;
	}
	//迭代器反向遍历
	auto it2 = map1.rbegin();
	while (it2 != map1.rend())
	{
		cout << it2->first << ":" << it2->second << endl;//等同于
		it2++;
	}
}

 

 

 

6. マルチマップ

 マルチマップ コンテナーとマップ コンテナーの基礎となる実装とメンバー関数のインターフェイスは基本的に同じですが、違いは、マルチマップではキー値の冗長性が可能であること、つまり、マルチマップ コンテナーに格納される要素を繰り返すことができることです。

  1. find の場合、multimap は、基になる検索ツリーの順序でキー値が key である最初の要素のイテレータを返します。

  2. マルチマップ コンテナでは冗長なキー値が許可されるため、[ ] 演算子オーバーロード関数を呼び出すときに、キー値をキーとして要素の値参照を返す必要があるという曖昧さがあるため、[ ] 演算子オーバーロード関数はマルチマップには実装されていません。容器。

void testMmap()
{
	multimap<int, string> mm;
	//允许键值冗余
	mm.insert(make_pair(2, "two"));
	mm.insert(make_pair(2, "double"));
	mm.insert(make_pair(2, "2"));
	mm.insert(make_pair(2, "second"));
	mm.insert(make_pair(1, "one"));
	mm.insert(make_pair(3, "three"));
	for (auto e : mm)
	{
		cout << e.first << ":" << e.second << endl;
	}
	cout << endl;
	//从第一个2找起,遍历到最后一个
	auto pos = mm.find(2);
	while (pos != mm.end() && pos->first == 2)
	{
		cout << pos->first << ":" << pos->second << endl;
		pos++;
	}
}

おすすめ

転載: blog.csdn.net/weixin_63246738/article/details/132281231