关联容器有4种:
set multiset map multimap
关联容器内部实现为红黑树。
与关联容器密切相关的有个数据类型为pair(键值对)
pair < T,T > 该数据类型为一个模板类,存储两个变量。成员变量firist和second分别为pair的第一个值和第二个值。
set:
存储的的值为一个键,具有唯一性;不可重复。
set的插入,返回值为一个pair。第一个值为iterator,代表插入位置的迭代器,第二个值为bool,代表是否插入成功。
测试代码
void Test()
{
set<string> setTest;
setTest.insert("1.相同值插入Test");
setTest.insert("5.这个第二个插入");
setTest.insert("2.这个第三个插入");
if (setTest.insert("1.相同值插入Test").second == false)
{ //这里插入于第一个插入相同的值,测试返回值
cout << "键重复插入失败\n";
}
cout << "Ergodic:";
for (auto str : setTest)
{ //遍历容器
cout << str << endl;
}
cout << endl;
cout << " ---------插入位置Test:---------\n";
for (auto it = setTest.insert("3.这个最后插入").first;
it != setTest.end(); ++it)
{//测试first 为插入位置的迭代器。
cout << *it << endl;
}
}
输出结果:
可以看出set插入的会自动排序。
ps:还可以在插入的时候多一个迭代器的参数,容器会先检查传入的迭代器指向的位置是否合法(在知道插入位置的情况下,这样使用可以提高插入效率)。如果位置不合法,那么将不会插入到传入迭代器指向的位置。
set的查找:
ps:set的find函数是不可以用迭代器进行查找的,只能按值查找;
set.find(Value); 返回值为查找到的值的位置的迭代器。没有找到返回end();
multiset:
multiset 可以重复键值, 也会自动排序。
multiset基本与set相同 但是insert返回值为插入位置的迭代器,不是pair。
multiset需要注意的是find,共有3种方式可以读出所有的要查找的值:
测试代码:
void Test()
{
multiset<int> setTest;
setTest.insert(1);
setTest.insert(1);
setTest.insert(2);
setTest.insert(3);
setTest.insert(5);
setTest.insert(3);
setTest.insert(1);
setTest.insert(5);
cout << "方法一:\n";
int iCount=setTest.count(1);//获得1这个键的个数
multiset<int>::iterator it = setTest.find(1);//find会返回第一个键的位置的迭代器
for (int i = 0; i < iCount; ++i, ++it)
{
cout << *it << " ";
}
cout << endl;
cout << "方法二:\n";
auto it_beg = setTest.lower_bound(3); //第一个等于该值的位置,如果没有返回最后一个下雨该值的位置
multiset<int>::iterator it_end = setTest.upper_bound(3); //第一个大于该值的位置
for (; it_beg != it_end; ++it_beg)
{
cout << *it_beg << " ";
}
cout << endl;
cout << "方法三:\n";
pair<multiset<int>::iterator, multiset<int>::iterator> itPair;
itPair = setTest.equal_range(5); //返回两个迭代器,就是lower_bound和upper_bound的返回值
for (; itPair.first != itPair.second; ++itPair.first)
{
cout << *itPair.first << " ";
}
cout << endl;
}
测试结果
map和multimap 于set大体类似,
主要差别就是map存储的是键值对,但是访问,比较等。还是依靠键值。不在赘述。
ps:不建议使用[]下标访问map。