用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; }}
推荐阅读
- 惠普战系列台式机评测 惠普台式电脑怎么样
- 沈月|盘点“致我们系列”六大主演现状,5人成了流量演员,1人不再拍戏
- 战神|推翻一切的新《战神》系列,续作还能带来惊喜吗?
- 美剧|网飞出品的6部黄暴系列美剧,一口气看完真过瘾
- 生化危机全系列剧情解析 生化危机电影剧情
- 美剧系列剧哪部好看,看看有什么好看的美剧-
- 姐姐|网络美女系列;乃木坂最漂亮的姐姐–卫藤美彩
- 为什么猎鹰系列发展迅速
- 主持人|“重启”系列续作电影《重启之深渊疑冢》今日上线 高能探险精彩升级
- 雅诗兰黛红石榴系列合适年纪是什么? 雅诗兰黛红石榴系列