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) // 返回指定元素的下限 |
||||||
数据拷贝与交换 |
|
||||||
排序 |
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; } |