关联容器(双向迭代器)
这里给出set的基本使用方法:
#include
#include
template <typename T>
void print(T Begin, T End);
int main() {
std::set<int> obj = { 0,2,1,4,6,3 };
//集合迭代器,反向迭代器
print(obj.begin(), obj.end());
std::cout << "----------------------------------------------------" << std::endl;
//拷贝构造:两种方式:1.class拷贝,2.给定范围拷贝
std::set<int> obj2(obj);
print(obj2.begin(), obj2.end());
std::set<int> obj3(obj.begin(), obj.end());
print(obj3.begin(), obj3.end());
std::cout << "----------------------------------------------------" << std::endl;
//erase方法:删除集合中的元素,可以删除指定位置的元素,也可以指定范围删除
obj2.erase(2);
print(obj2.begin(), obj2.end());
obj2.erase(obj2.begin(), obj2.end());
print(obj2.begin(), obj2.end());
std::cout << "----------------------------------------------------" << std::endl;
//insert方法:会自动排序,可以指定位置添加元素,返回值类型:pair,bool
obj.insert(5);
std::cout << typeid(obj.insert(5)).name() << std::endl;
std::cout << typeid(obj.insert(5).second).name() << std::endl;
//如果要判断是否插入成功,我们应该这样判断:(这里因为是集合要求值唯一,集合中已经有5了,所以插入失败
if (obj.insert(5).second) {
std::cout << "seccessful" << std::endl;
}
else {
std::cout << "failed" << std::endl;
}
print(obj.begin(), obj.end());
std::cout << "----------------------------------------------------" << std::endl;
//find方法:在集合中寻找,返回值类型:迭代器类型,如果找到了,则返回找到位置的迭代器,如果没有找到,则返回obj.end();
std::cout << typeid(obj.find(4)).name() << std::endl;
if (obj.find(4) != obj.end()) {
std::cout << "successsful" << std::endl;
}
else {
std::cout << "failed" << std::endl;
}
if (obj.find(9) != obj.end()) {
std::cout << "successsful" << std::endl;
}
else {
std::cout << "failed" << std::endl;
}
return 0;
}
template<typename T>
void print(T Begin, T End)
{
T i;
for (i = Begin; i != End; i++) {
std::cout << *i << std::endl;
}
std::cout << std::endl;
}
基于平衡二叉树(红黑树)
多重集合允许值重复,其他和set一样
这里给出multiset的基本使用方法,实际上和set没太大的区别:
#include
#include
template <typename T>
void print(T Begin, T End);
int main() {
std::multiset obj = { 0,2,1,4,6,3 };
//集合迭代器,反向迭代器
print(obj.begin(), obj.end());
std::cout << "----------------------------------------------------" << std::endl;
//拷贝构造:两种方式:1.class拷贝,2.给定范围拷贝
std::multiset obj2(obj);
print(obj2.begin(), obj2.end());
std::multiset obj3(obj.begin(), obj.end());
print(obj3.begin(), obj3.end());
std::cout << "----------------------------------------------------" << std::endl;
//erase方法:删除集合中的元素,可以删除指定位置的元素,也可以指定范围删除
obj2.erase(2);
print(obj2.begin(), obj2.end());
obj2.erase(obj2.begin(), obj2.end());
print(obj2.begin(), obj2.end());
std::cout << "----------------------------------------------------" << std::endl;
//insert方法:会自动排序,可以指定位置添加元素,返回值类型:pair,bool
obj.insert(5);
std::cout << typeid(obj.insert(5)).name() << std::endl;
print(obj.begin(), obj.end());
obj.insert(5);
obj.insert(6);
obj.insert(5);
obj.insert(5);
obj.insert(9);
print(obj.begin(), obj.end());
std::cout << "----------------------------------------------------" << std::endl;
//find方法:在集合中寻找,返回值类型:迭代器类型,如果找到了,则返回找到位置的迭代器,如果没有找到,则返回obj.end();
std::cout << typeid(obj.find(4)).name() << std::endl;
if (obj.find(4) != obj.end()) {
std::cout << "successsful" << std::endl;
}
else {
std::cout << "failed" << std::endl;
}
if (obj.find(9) != obj.end()) {
std::cout << "successsful" << std::endl;
}
else {
std::cout << "failed" << std::endl;
}
return 0;
}
template
void print(T Begin, T End)
{
T i;
for (i = Begin; i != End; i++) {
std::cout << *i << std::endl;
}
std::cout << std::endl;
无序集合 基于哈希表
区别:不会对元素进行排序,其他基本没区别
#include
#include
template <typename T>
void print(T Begin, T End);
int main() {
std::unordered_set<int> obj = { 0,2,1,4,6,3 };
//集合迭代器,反向迭代器
print(obj.begin(), obj.end());
std::cout << "----------------------------------------------------" << std::endl;
//拷贝构造:两种方式:1.class拷贝,2.给定范围拷贝
std::unordered_set<int> obj2(obj);
print(obj2.begin(), obj2.end());
std::unordered_set<int> obj3(obj.begin(), obj.end());
print(obj3.begin(), obj3.end());
std::cout << "----------------------------------------------------" << std::endl;
//erase方法:删除集合中的元素,可以删除指定位置的元素,也可以指定范围删除
obj2.erase(2);
print(obj2.begin(), obj2.end());
obj2.erase(obj2.begin(), obj2.end());
print(obj2.begin(), obj2.end());
std::cout << "----------------------------------------------------" << std::endl;
//insert方法:会自动排序,可以指定位置添加元素,返回值类型:pair,bool
obj.insert(5);
std::cout << typeid(obj.insert(5)).name() << std::endl;
print(obj.begin(), obj.end());
obj.insert(5);
obj.insert(6);
obj.insert(5);
obj.insert(5);
obj.insert(9);
print(obj.begin(), obj.end());
std::cout << "----------------------------------------------------" << std::endl;
//find方法:在集合中寻找,返回值类型:迭代器类型,如果找到了,则返回找到位置的迭代器,如果没有找到,则返回obj.end();
std::cout << typeid(obj.find(4)).name() << std::endl;
if (obj.find(4) != obj.end()) {
std::cout << "successsful" << std::endl;
}
else {
std::cout << "failed" << std::endl;
}
if (obj.find(9) != obj.end()) {
std::cout << "successsful" << std::endl;
}
else {
std::cout << "failed" << std::endl;
}
return 0;
}
template<typename T>
void print(T Begin, T End)
{
T i;
for (i = Begin; i != End; i++) {
std::cout << *i << std::endl;
}
std::cout << std::endl;
}
unordered_multiset:多重无序集合
==允许元素重复,也不会自动排序
map 映射/地图 基于平衡二叉树(红黑树)
这里给出map的基本使用方法:
#include
#include
#include
#include
int main() {
//定义前需要初始化,第一个为key类型,第二个为value
std::map<int, std::string> obj = { {1,"aaa"},{2,"bbb"},{3,"ccc"},{4,"ddd"} };
//map(映射表)实际上可以认为是键值对pair的一个集合
std::pair<int, std::string> a = { 5,"ddd" };
std::pair<int, std::string> b;
b.first = 6;
b.second = "eee";
//insert方法,插入值,会自动排序(根据键值key)
obj.insert(a);
obj.insert(b);
for (auto i = obj.begin(); i != obj.end(); i++)
{
std::cout << i->first << ":" << i->second << std::endl;
}
//find方法:第一层迭代器,第二层pair
std::cout << typeid(obj.find(3)).name() << std::endl;
auto c = obj.find(3);//返回3所在的位置
auto d = *c;
std::cout << d.first << "\t" << d.second << std::endl;
//eraer方法:删除键值key为指定值的元素,返回值类型:键值key的无符号类型
std::cout << typeid(obj.erase(1)).name() << std::endl;
int e = obj.erase(1);
std::cout << d.first <<"\t" <<d.second << std::endl;
for (auto i = obj.begin(); i != obj.end(); i++)
{
std::cout << i->first << ":" << i->second << std::endl;
}
return 0;
}
#include
#include
#include
#include
int main() {
//定义前需要初始化,第一个为key类型,第二个为value
std::map<int, std::string> obj = { {1,"aaa"},{2,"bbb"},{3,"ccc"},{4,"ddd"} };
//map(映射表)实际上可以认为是键值对pair的一个集合
std::pair<int, std::string> a = { 5,"ddd" };
std::pair<int, std::string> b;
b.first = 6;
b.second = "eee";
//insert方法,插入值,会自动排序(根据键值key)
obj.insert(a);
obj.insert(b);
for (auto i = obj.begin(); i != obj.end(); i++)
{
std::cout << i->first << ":" << i->second << std::endl;
}
//find方法:第一层迭代器,第二层pair
std::cout << typeid(obj.find(3)).name() << std::endl;
auto c = obj.find(3);//返回3所在的位置
auto d = *c;
std::cout << d.first << "\t" << d.second << std::endl;
//eraer方法:删除键值key为指定值的元素,返回值类型:键值key的无符号类型
std::cout << typeid(obj.erase(1)).name() << std::endl;
int e = obj.erase(1);
std::cout << d.first <<"\t" <<d.second << std::endl;
for (auto i = obj.begin(); i != obj.end(); i++)
{
std::cout << i->first << ":" << i->second << std::endl;
}
return 0;
}
多重映射 基于平衡二叉树(红黑树)允许键值重复存在,会自动排序
无序映射 哈希表不会自动排序,不允许键值重复存在
允许键值重复存在,且不会自动排序
如果发现文章中有错误,还请大家指出来,我会非常虚心地学习,我们一起进步!!!