[STL] del sistema / de la asignación de contenedores conjunto múltiple, insertar, eliminar, buscar. . . Caso y. (Relativamente fácil de aprender)

set / contenedor multiset

set / características multiconjuntos son:

Todos los elementos se ordenan automáticamente de acuerdo con el valor del elemento. Set es una RB-tree (árbol rojo-negro, un árbol binario balanceado) es el mecanismo subyacente de que la eficiencia de búsqueda es muy buena, establece que el contenedor no permitir que los elementos duplicados, conjunto múltiple permite que los elementos duplicados

set / multiconjuntos diversas operaciones

Aquí Insertar imagen Descripción
Aquí Insertar imagen DescripciónAquí Insertar imagen DescripciónAquí Insertar imagen Descripción

Caso (fácil de aprender)

El caso de la operación anterior, en conjunción con el código siguiente.

#include<iostream>

#include<set>
#include<list>
using namespace std;
void printSet(set<int>& v) {
	for (set<int>::iterator it = v.begin(); it != v.end(); ++it) {
		cout << *it << " ";
	}
	cout << endl;
}
//仿函数
////如何改变默认排序?

class mycompare {
public:
	constexpr bool  operator()(int v1, int v2) const{
		return v1 > v2;
	}
};
void test00() {
	set<int,mycompare>s1;//自动排序,默认从小到大。
	s1.insert(7);
	s1.insert(2);
	s1.insert(4);
	s1.insert(5);
	s1.insert(1);
	for (set<int>::iterator it = s1.begin(); it != s1.end(); ++it) {
		cout << *it << " ";
	}
	cout << endl;
}


//1-set容器初始化
void test01() {
	set<int>s1;//自动排序,默认从小到大。
	s1.insert(7);
	s1.insert(2);
	s1.insert(4);
	s1.insert(5);
	s1.insert(1);
	printSet(s1);//1 2 4 5 7
	//赋值操作
	set<int>s2;
	s2 = s1;

	//删除操作

	s1.erase(s1.begin());
	s1.erase(7);
	printSet(s1);//2 4 5

	//如何改变默认排序?
	
}
//2-查找
void test02() {
	set < int>s1;
	s1.insert(7);
	s1.insert(2);
	s1.insert(4);
	s1.insert(5);
	s1.insert(1);

	set<int>::iterator ret = s1.find(1);
	
	if (ret == s1.end())
		cout << "未找到" << endl;
	else {
		cout << *ret << endl;//1
	}
	//找比2等于大于的第一个值,
	ret=s1.lower_bound(2);//找比2等于大于的第一个值,如果不存在等于的就找把它大的第一个数
	cout << *ret << endl;//2
	//找第一个大于key的值
	ret = s1.upper_bound(2);
	if (ret == s1.end())
		cout << "未找到" << endl;
	else {
		cout << *ret << endl;//4
	}

	//equal_range 返回Lower_bound和upper_bound;
	pair<set<int>::iterator, set<int>::iterator> myset = s1.equal_range(2);
	if (myset.first == s1.end())
		cout << "未找到" << endl;
	else {
		cout << *(myset.first) << endl;//2
	}
	if (myset.second == s1.end())
		cout << "未找到" << endl;
	else {
		cout << *(myset.second) << endl;//4
	}

}
class Person {
public:
	Person(int age, int id) :id(id), age(age) {}
public:
	int id;
	int age;
};
class mycompare2 {
public:
	bool operator()(Person p1, Person p2) const {
		return p1.age > p2.age;
	}
};
void test03() {
	set<Person, mycompare2>sp;
	Person p1(10, 20), p2(30, 40), p3(50, 60);
	sp.insert(p1);
	sp.insert(p2);
	sp.insert(p3);

	Person p4(10, 20);

	for (set<Person, mycompare2>::iterator it = sp.begin(); it != sp.end(); ++it)
		cout << (*it).age << " "<<(*it).id<<endl;

	//查找
	set<Person,mycompare>::iterator ret=sp.find(p4);
	if (ret == sp.end()) {
		cout << "未找到" << endl;
	}
	else {
		cout << "ret: " << (*ret).age<<" "<<(*ret).id << endl;
	}


}

int main(void) {
	//test00();
	//test01();
	//test02();
	test03();
	return 0;
}
Publicado 57 artículos originales · ganado elogios 28 · vistas 4126

Supongo que te gusta

Origin blog.csdn.net/weixin_41747893/article/details/102942118
Recomendado
Clasificación