Cpp浅析系列-STL之map( 二 )


用insert函数和emplace函数插入数据 , 在数据的插入上涉及到集合的唯一性这个概念 , 即当map中有这个关键字时 , insert操作是插入数据不了的 。
用索引[]方式就不同了 , 它可以覆盖对应的值 。
遍历元素强烈建议使用迭代器遍历集合!
void search1() {    map<int, string> m(            {                    {1, "A"},                    {3, "C"},                    {2, "B"}            }    );    map<int, string>::iterator iter;    for (iter = m.begin(); iter != m.end(); iter++) {        cout << iter->first << ' ' << iter->second << endl;    }}//1 A// 2 B// 3 C下面介绍一个反面例子 , 看看直接使用索引去遍历而产生的结果 。
void search2() {    map<int, string> m(            {                    {1, "A"},                    {3, "C"},                    {5, "B"}            }    );    cout << "遍历前元素的个数:" << m.size() << endl;    for (int i = 0; i < m.size(); i++) {        cout << i << ' ' << m[i] << endl;    }    cout << "遍历后元素的个数:" << m.size();}//遍历前元素的个数:3// 0// 1 A// 2// 3 C// 4// 5 B// 遍历后元素的个数:6很明显 , 因为没有判定是否存在而是直接无脑使用 , 原意是遍历一遍集合 , 结果却是修改了集合!
删除元素直接删除元素可以清空 , 也可以用迭代器删除指定范围元素或者单个元素 。
但是在遍历的时候要注意 , 使用迭代器删除元素后 , 迭代器可能会变成类似野指针的存在!
/* * 删除有两种方式 ,  * clear是直接清空 * erase是删除指定迭代器范围内的数字 * 也可以用来删除指定的单个元素 * */void del1() {    map<int, string> m(            {                    {1, "A"},                    {2, "B"},                    {3, "C"}            }    );    //清空    m.clear();//{}    if (m.empty()) {//判断Vector为空则返回true        m.insert(pair<int, string>(4, "D"));        m.insert(pair<int, string>(5, "E"));        m.insert(pair<int, string>(6, "F"));        //用迭代器删除单个元素 , 注意指针被删除后就失效了        map<int, string>::iterator iter = m.begin();        m.erase(iter);//所剩元素{5,E},{6,F} , 此时的iter仍然是{4,D}        cout << "错误的迭代器内容:" << iter->first << ' ' << iter->second << endl;        //删除一个范围 ,  只保留最后一个        m.erase(m.begin(), ++m.end()); //{6,F}        //通过关键字索引的数据存在就删除 , 并返回1;如果关键字索引的数据不存在就不操作 , 并返回0        m.erase(2);    }    map<int, string>::iterator iter;    for (iter = m.begin(); iter != m.end(); iter++) {        cout << iter->first << ' ' << iter->second << endl;    }}


推荐阅读