std::map

 

初始化

std::map<string,int>m; // 空对象

std::map<string,int> m =

{ { “abc”, 1},

 { “cdx”, 2},

 {“123345”, 12}};  //构造初始化,该方式了常用于快速构造一个小规模的字典.

成员访问

std::map<string, int> m;

int val = m[“abc”];  // 下标访问

int val2 = m[“abcd”] ; // 如果abcd 不存在,不会抛出异常,且会自动插入该元素,值为0, 这样导致对m进行了修改;

int va2=m.at(“abcd”);// 如果abcd不存在,会抛出异常

插入元素

std::map <string, int> m;

1.  m.insert(std::pair<string,int>(“a”,1));

2.  m.insert(std::map<string,int>::value_type(“a”,1));

3.  m[“a”] = 1;

4. insert_or_assign (c++17)

   #include <iostream>

#include <map>
#include <string>
int main()
{
    std::map<std::string, std::string> myMap;
    myMap.insert_or_assign("a", "apple"     );
    myMap.insert_or_assign("b", "bannana"   );
    myMap.insert_or_assign("c", "cherry"    );
    myMap.insert_or_assign("c", "clementine");
    for (const auto &pair : myMap) {
        std::cout << pair.first << " : " << pair.second << '\n';
    }
}

Output:

a : apple

b : bannana

c : clementine

删除元素

m.erase(“p”);// 删除元素值为p元素,返回一个指向被删除元素之后的迭代器。

vec.erase(begin,end);//删除b,e所指定范围内的元素,返回一个指向最后被删除元素之后的迭代器。

m.clear();// 删除所有元素

注意,删除元素,会导致迭代器无效

auto iter = m.begin();

for(; iter != m.end();){

   if(iter->second == 1) iter = m.erase(iter);

   else iter++;

}

遍历

1).

 auto it = m.begin();

 auto it_end = m.end();

 for(; it != it_end; ++it){

 std::cout << it->first  << “:” << it->second << std::endl;

 }                   

2).

  返回map一个指定元素的前一个元素的迭代器和后一个元素迭代器。用

  pair<iterator, iterator> equal_range(const key& _key);

  pair<const_iterator, const_iterator> equal_range(const key& _key);

3).

  const_iterator lower_bound(const key& _key); // 返回指定元素的上限

  iterator lower_bound(const key& _key); // 返回指定元素的上限

  const_iterator upper_bound(const key& _key) // 返回指定元素的下限

  iterator upper_bound(const key& _key) // 返回指定元素的下限  

数据拷贝与交换

void swap( map& other );

(until C++17)

void swap( map& other ) noexcept(/* see below */);

(since C++17

值得注意的是,两个map的模板类型必须是一样,否则会出错

 

排序

map只能修改存放排序,即存入是排序。

1.在构造时设置比较函数或比较对象类(std自身提供一系列类型的对象类),例如:

std::map<int, int, std::greater<int>> m; //m使用降序,如果无参数3,则默认使用int类型内置排序

2.自定key的排序

 2.1在key的定义时重载operator<符号

 2.2 根据需要自定义比较函数类;如下

class MyCompare{
public:
     bool operator()(const MyKey& first, const MyKey& second)const{
         if (first.no > second.no) return true;
         else if (first.no == second.no)return first.val > second.val;
         else return false;
     }
 };
std::map<MyKey, int, MyCompare> mi;
 for (int i = 0; i < 5; i++){
     mi[MyKey(i * 2, i)] = i * 2;
 }

 2.3使用lambda表达式构造比较函数替换比较对象类,代码更简洁。

查找

auto it = m.find(“abc”);

if(it!=m.end()){

  cout<<it->first<<”:”<<it->second<<endl;

}

else{

  cout<<”not found”<<endl;

}

posted @ 2019-06-10 08:58  Reboost  阅读(1027)  评论(0)    收藏  举报