本文将对容器std::map如何查找元素判断键值是否存在的方法进行总结。

1 std::map查找元素

1.1 count

count函数的作用主要是返回在std::map中指定键值的数量,因为std::map的键值不可重复,所以如果std::map存在指定键值,则返回1,如果std::map中不存在指定键值,则返回0。

#include <iostream>
#include <map>
#include <string>
#include <iomanip>

void PrintMap(const std::map<int, std::string>& inMap)
{
    std::map<int, std::string>::const_iterator const_iter = inMap.begin();

    while (const_iter != inMap.end())
    {
        std::cout << const_iter->first << " " << const_iter->second << std::endl;

        const_iter++;
    }
}

int main()
{
    std::cout << "original map:" << std::endl;

    std::map<int, std::string> myMap;
    for (int i = 0; i < 5; ++i)
    {
        myMap[i] = std::to_string(i);
    }
    PrintMap(myMap);

    if (myMap.count(1))
    {
        std::cout << "该容器包含指定键值" << std::endl;
    }
    else
    {
        std::cout << "该容器不包含指定键值" << std::endl;
    }

    return 0;
}

结果:

original map:
0 0
1 1
2 2
3 3
4 4
该容器包含指定键值

1.2 find

find函数的作用主要是在容器std::map中查找指定键值的元素,如果该键值在容器中存在,则返回该元素的迭代器,如果该键值在容器中不存在,则返回指向容器end末尾的迭代器。

#include <iostream>
#include <map>
#include <string>
#include <iomanip>

void PrintMap(const std::map<int, std::string>& inMap)
{
    std::map<int, std::string>::const_iterator const_iter = inMap.begin();

    while (const_iter != inMap.end())
    {
        std::cout << const_iter->first << " " << const_iter->second << std::endl;

        const_iter++;
    }
}

int main()
{
    std::cout << "original map:" << std::endl;

    std::map<int, std::string> myMap;
    for (int i = 0; i < 5; ++i)
    {
        myMap[i] = std::to_string(i);
    }
    PrintMap(myMap);

    std::map<int, std::string>::iterator iter = myMap.find(1);
    if (iter != myMap.end())
    {
        std::cout << "该容器包含指定键值" << std::endl;
    }
    else
    {
        std::cout << "该容器不包含指定键值" << std::endl;
    }

    return 0;
}

结果:

original map:
0 0
1 1
2 2
3 3
4 4
该容器包含指定键值

1.3 contains(C++20)

contains函数的作用主要是在容器std::map中查找指定键值的元素,如果容器中存在该键值的元素,则返回true,如果容器不存在该键值的元素,则返回false。

#include <iostream>
#include <map>
#include <string>
#include <iomanip>

void PrintMap(const std::map<int, std::string>& inMap)
{
    std::map<int, std::string>::const_iterator const_iter = inMap.begin();

    while (const_iter != inMap.end())
    {
        std::cout << const_iter->first << " " << const_iter->second << std::endl;

        const_iter++;
    }
}

int main()
{
    std::cout << "original map:" << std::endl;

    std::map<int, std::string> myMap;
    for (int i = 0; i < 5; ++i)
    {
        myMap[i] = std::to_string(i);
    }
    PrintMap(myMap);


    if (myMap.contains(1))
    {
        std::cout << "该容器包含指定键值" << std::endl;
    }
    else
    {
        std::cout << "该容器不包含指定键值" << std::endl;
    }

    return 0;
}

结果:

original map:
0 0
1 1
2 2
3 3
4 4
该容器包含指定键值

1.4 equal_rang

equal_range函数的作用主要是根据键值,返回一对迭代器的std::pair对象。如果该键值在容器中存在,则std::pair对象中的第一个迭代器指向该键关联的第一个实例,第二个迭代器指向该键关联的最后一个实例的下一位置。如果找不到匹配的元素,则pair对象中的两个迭代器都将指向此键应该插入的位置。总之,equal_range返回迭代器位置区间 [ lower_bound, upper_bound ) 。

#include <iostream>
#include <map>
#include <string>
#include <iomanip>

void PrintMap(const std::map<int, std::string>& inMap)
{
    std::map<int, std::string>::const_iterator const_iter = inMap.begin();

    while (const_iter != inMap.end())
    {
        std::cout << const_iter->first << " " << const_iter->second << std::endl;

        const_iter++;
    }
}

int main()
{
    std::cout << "original map:" << std::endl;

    std::map<int, std::string> myMap;
    for (int i = 0; i < 5; ++i)
    {
        myMap[i] = std::to_string(i);
    }
    PrintMap(myMap);

    std::pair<std::map<int, std::string>::iterator, std::map<int, std::string>::iterator> result = myMap.equal_range(1);

    for (std::map<int, std::string>::iterator iter = result.first; iter != result.second; iter++)
    {
        std::cout << "m[" << iter->first << "] = " << iter->second << std::endl;
    }

    return 0;
}

结果:

original map:
0 0
1 1
2 2
3 3
4 4
m[1] = 1

另一个例子:

#include <iostream>
#include <map>
int main ()
{
  std::multimap<char,int> my_multimap;
  my_multimap.insert(std::make_pair('a',10));
  my_multimap.insert(std::make_pair('a',20));
  my_multimap.insert(std::make_pair('a',30));
  my_multimap.insert(std::make_pair('a',40));
  my_multimap.insert(std::make_pair('b',10));
  my_multimap.insert(std::make_pair('c',10));
  my_multimap.insert(std::make_pair('c',20));
  std::cout << my_multimap.size() << std::endl;
  std::pair<std::multimap<char,int>::iterator,std::multimap<char,int>::iterator> ret;
  ret=my_multimap.equal_range('a');
  for(std::multimap<char,int>::iterator it=ret.first;it !=ret.second;it++){
        std::cout << it->first << " => " << it->second << '\n';
  }
  return 0;
}

结果:

7
a => 10
a => 20
a => 30
a => 40

1.5 lower_bound

lower_bound函数的作用主要是返回std::map容器中第一个不小于(即大于或者等于)指定key值元素的迭代器。如果没有找到这种元素,则返回容器尾部的迭代器,即std::map::end()。

#include <iostream>
#include <map>
#include <string>
#include <iomanip>

void PrintMap(const std::map<int, std::string>& inMap)
{
    std::map<int, std::string>::const_iterator const_iter = inMap.begin();

    while (const_iter != inMap.end())
    {
        std::cout << const_iter->first << " " << const_iter->second << std::endl;

        const_iter++;
    }
}

int main()
{
    std::cout << "original map:" << std::endl;

    std::map<int, std::string> myMap;
    for (int i = 0; i < 5; ++i)
    {
        myMap[i] = std::to_string(i);
    }
    PrintMap(myMap);

    std::map<int, std::string>::iterator iter = myMap.lower_bound(1);
    if (iter != myMap.end())
    {
        std::cout <<"第一个不小于指定key的元素为:" << iter->first << " " << iter->second << std::endl;
    }

    return 0;
}

结果:

original map:
0 0
1 1
2 2
3 3
4 4
第一个不小于指定key的元素为:1 1

1.6 upper_bound

upper_bound函数的作用主要是返回std::map容器中第一个大于指定key值元素的迭代器。如果没有找到这种元素,则返回容器尾部的迭代器,即std::map::end()。

#include <iostream>
#include <map>
#include <string>
#include <iomanip>

void PrintMap(const std::map<int, std::string>& inMap)
{
    std::map<int, std::string>::const_iterator const_iter = inMap.begin();

    while (const_iter != inMap.end())
    {
        std::cout << const_iter->first << " " << const_iter->second << std::endl;

        const_iter++;
    }
}

int main()
{
    std::cout << "original map:" << std::endl;

    std::map<int, std::string> myMap;
    for (int i = 0; i < 5; ++i)
    {
        myMap[i] = std::to_string(i);
    }
    PrintMap(myMap);

    std::map<int, std::string>::iterator iter = myMap.upper_bound(1);
    if (iter != myMap.end())
    {
        std::cout <<"第一个不小于指定key的元素为:" << iter->first << " " << iter->second << std::endl;
    }

    return 0;
}

结果:

original map:
0 0
1 1
2 2
3 3
4 4
第一个不小于指定key的元素为:2 2