【STL学习】容器篇-关联容器

关联容器有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;
    }
}

输出结果:
【STL学习】容器篇-关联容器_第1张图片
可以看出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;
}

测试结果【STL学习】容器篇-关联容器_第2张图片

map和multimap 于set大体类似,
主要差别就是map存储的是键值对,但是访问,比较等。还是依靠键值。不在赘述。
ps:不建议使用[]下标访问map。

你可能感兴趣的:(【STL学习】容器篇-关联容器)