📜  C++ STL中的map :: at()和map :: swap()(1)

📅  最后修改于: 2023-12-03 15:29:50.804000             🧑  作者: Mango

C++ STL中的map::at()和map::swap()

介绍

STL(Standard Template Library)是C++中的一个重要的库,旨在提供基于数据结构的通用算法。其包括一些标准容器,如vector、list、set、map等。

map是STL中的一个容器,其是一种关联式容器,即按键排序,键值对唯一。map内部自建一颗红黑树,其时间复杂度为O(log n)。在map中,每个元素都是一个键值对(pair类型),其中键充当索引,值存储与之相关的内容。map::at()和map::swap()是map中两个重要的成员函数,本文将作详细介绍。

map::at()

map::at()是一个成员函数,其接受一个参数key,返回与该key相关的值。如果该key不存在,则会抛出一个out_of_range异常。

// map::at()的函数原型
mapped_type& at (const key_type& k);
const mapped_type& at (const key_type& k) const;

例如,在下面的例子中,我们创建了一个map对象,然后用at函数查找一个不存在的键:

#include <iostream>
#include <map>

int main()
{
    std::map<int,std::string> mymap = {{1,"foo"},{2,"bar"},{3,"baz"}};
    try
    {
        std::cout << mymap.at(4) << '\n';
    }
    catch (const std::out_of_range& oor)
    {
        std::cerr << "Out of Range error: " << oor.what() << '\n';
    }
    return 0;
}

输出结果:

Out of Range error: map::at

我们可以看到,函数抛出了一个out_of_range异常,因为键值4不存在。

map::swap()

map::swap()是一个成员函数,其交换调用对象和参数map之间的元素。交换两个map的开销很小,因为这只涉及指针的调整。而且,它也是交换操作的安全选择,因为它们不会导致map底层树的重组。

// map::swap()的函数原型
void swap (map& x);

下面的例子展示了如何使用map::swap()函数:

#include <iostream>
#include <map>
#include <utility>

void display(std::string comment, std::map<int,std::string>& mymap)
{
    std::cout << comment << '\n';
    for (auto& x: mymap)
        std::cout << x.first << ": " << x.second << '\n';
}

int main()
{
    std::map<int,std::string> mymap1 = {{1,"foo"},{2,"bar"},{3,"baz"}};
    std::map<int,std::string> mymap2 = {{4,"qux"},{5,"quux"},{6,"corge"}};

    display("Before swap, mymap1: ", mymap1);
    display("Before swap, mymap2: ", mymap2);

    mymap1.swap(mymap2);

    display("After swap, mymap1: ", mymap1);
    display("After swap, mymap2: ", mymap2);

    return 0;
}

输出结果:

Before swap, mymap1: 
1: foo
2: bar
3: baz
Before swap, mymap2: 
4: qux
5: quux
6: corge
After swap, mymap1: 
4: qux
5: quux
6: corge
After swap, mymap2: 
1: foo
2: bar
3: baz

我们可以看到,函数成功地交换了两个map的元素,而且开销也非常小。