Anwendung von C++ Map und Set (ausführliche Erklärung)

Inhaltsverzeichnis

1. Assoziative Container

2. Schlüssel-Wert-Paare

3. eingestellt

4. Multiset

5. Karte

6. Multimap


1. Assoziative Container

 

2. Schlüssel-Wert-Paare

Wird zur Darstellung einer Struktur mit einer Eins-zu-eins-Entsprechung verwendet. Diese Struktur enthält im Allgemeinen nur zwei Mitgliedsvariablen, Schlüssel und Wert. Schlüssel stellt den Schlüsselwert dar und Wert stellt die dem Schlüssel entsprechenden Informationen dar.

Definition:

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. eingestellt

a.set ist ein Container, der Elemente in einer bestimmten Reihenfolge speichert. In dieser Reihenfolge wird der Iterator von set verwendet, um die Elemente in der Menge zu durchlaufen, und eine geordnete Reihenfolge kann erhalten werden.

Hinweis: Im Gegensatz zu Map/Multimap speichert Map/Multimap echte Schlüssel-Wert-Paare <Schlüssel, Wert>, und nur Werte werden im Satz platziert, aber die aus <Wert, Wert> bestehenden Schlüssel-Wert-Paare werden tatsächlich am gespeichert unten.

b. In der Menge wird es auch durch den Wert des Elements identifiziert (Wert ist der Schlüssel und der Typ ist T). Wenn Sie ein Element in die Menge einfügen, müssen Sie nur den Wert einfügen. Es ist nicht erforderlich, einen Schlüssel zu erstellen -Wert-Paar, und jeder Wert muss eindeutig sein. (Sie können set verwenden, um Duplikate zu entfernen.)

Hinweis: Die Elemente im Satz können im Container nicht geändert werden (Elemente sind immer konstant und Änderungen können die Reihenfolge der Daten nicht garantieren), sie können jedoch in den Container eingefügt oder daraus gelöscht werden

c. Intern werden die Elemente in der Menge immer nach den spezifischen strengen schwachen Sortierkriterien sortiert, die durch das interne Vergleichsobjekt (Typvergleich) angegeben werden. Hinweis: Standardmäßig basiert der Vergleich auf weniger als und nach Durchquerung mittlerer Ordnung. es ist eine aufsteigende Reihenfolge.

d.set-Container greifen im Allgemeinen langsamer auf einzelne Elemente per Schlüssel zu als unordered_set-Container, sie ermöglichen jedoch die direkte Iteration von Teilmengen basierend auf der Reihenfolge

e.set wird mithilfe eines binären Suchbaums (Rot-Schwarz-Baum) auf der untersten Ebene implementiert

Konstruktsatz 

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++;
	}
}

 

 Kapazität einstellen:

Änderung des Sets:

 

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. Multiset

Die Implementierung und Schnittstelle des Multiset-Containers und des Set-Containers sind grundsätzlich gleich. Der einzige Unterschied besteht darin, dass Multiset Schlüsselwertredundanz ermöglicht, dh die im Multiset-Container gespeicherten Elemente können wiederholt werden.

Hinweis: Für find gibt multiset einen Iterator des ersten Elements zurück, dessen Schlüsselwert in der Reihenfolge des zugrunde liegenden Suchbaums der Schlüssel ist.

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. Karte

a. Map ist ein assoziativer Container, der Elemente aus Schlüssel und Wert in einer bestimmten Reihenfolge (im Vergleich zum Schlüssel) speichert.

b. In einer Karte wird der Schlüsselwertschlüssel normalerweise zum Sortieren und eindeutigen Identifizieren von Elementen verwendet, während der Wertwert den mit diesem Schlüsselwertschlüssel verknüpften Inhalt speichert. Die Typen von Schlüssel und Wert können unterschiedlich sein, und innerhalb der Karte sind Schlüssel und Wert durch den Mitgliedstyp value_type miteinander verbunden, und ihr Aliasname lautet pair:typedef pair value_type;

c. Die Elemente in der internen Karte werden immer nach dem Schlüsselwert verglichen, sortiert und durchsucht.

d. Die Geschwindigkeit des Zugriffs auf ein einzelnes Element über den Schlüsselwert in der Karte ist normalerweise langsamer als die des unordered_map-Containers, aber die Karte ermöglicht die direkte Iteration von Elementen entsprechend der Reihenfolge (d. h. wenn Sie über die Elemente in der Karte iterieren, können Sie eine geordnete Reihenfolge erhalten Reihenfolge)

e.map unterstützt Indexzugriffsmethoden. Das heißt, indem Sie den Schlüssel in [] eingeben, können Sie den Wert finden, der dem Schlüssel entspricht (hier ist ein Wrapper beim Einfügen).

f.map wird normalerweise als binärer Suchbaum implementiert (genauer: ausgeglichener binärer Suchbaum (Rot-Schwarz-Baum))

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;
	}
}

Karteniterator:

 

 

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. Multimap

 Die zugrunde liegenden Implementierungs- und Mitgliedsfunktionsschnittstellen des Multimap-Containers und des Map-Containers sind grundsätzlich gleich. Der Unterschied besteht darin, dass Multimap Schlüsselwertredundanz ermöglicht, dh die im Multimap-Container gespeicherten Elemente können wiederholt werden.

  1. Für find gibt multimap einen Iterator des ersten Elements zurück, dessen Schlüsselwert der Schlüssel in der Reihenfolge des zugrunde liegenden Suchbaums ist.

  2. Da der Multimap-Container redundante Schlüsselwerte zulässt, besteht beim Aufruf der Operator-Überladungsfunktion [ ] Unklarheit darüber, welcher Wertverweis des Elements mit dem Schlüsselwert als Schlüssel zurückgegeben werden soll. Daher ist die Operator-Überladungsfunktion [ ] in der Multimap nicht implementiert Container.

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++;
	}
}

Ich denke du magst

Origin blog.csdn.net/weixin_63246738/article/details/132281231
Empfohlen
Rangfolge