Cpp浅析系列-STL之map( 三 )
遍历集合并删除元素如果想要遍历整个map , 并删除所有满足指定数值的应该如下:
/* * 遍历集合以删除指定条件的元素 * */void del2() { map<int, string> m( { {1, "A"}, {2, "B"}, {3, "C"} } ); map<int, string>::iterator iter; // 删除元素后 , 期望iter指针是继续指向{3,C}的 , // 但是经过iter++后 , 竟然又到了上一个元素! // 很明显 , 删除元素后的迭代器变成了类似野指针的存在! // for (iter = m.begin(); iter != m.end(); iter++) { // if (iter->first == 2 || iter->second == "B") { // m.erase(iter); // } // cout << iter->first << ' ' << iter->second << endl; // } //结果是: // 1 A // 2 B // 1 A // 3 C // 正确做法应该是先复制出来一个临时迭代器 // 接着将原来的迭代器后移一位指向正常的元素 // 最后用临时迭代器删除指定元素! // 第二步和第三步不能反了 , 否则也会影响到原来正常的迭代器! for (iter = m.begin(); iter != m.end();) { if (iter->first == 2) { map<int, string>::iterator iterTemp = iter; ++iter; m.erase(iterTemp); } else { cout << iter->first << ' ' << iter->second << endl; ++iter; } } // 结果是 // 1 A // 3 C}
用迭代器删除元素 , 先是断言确定迭代器不是尾迭代器 , 接着将当前迭代器复制到一个新对象 , 最后返回的就是这个新的迭代器对象 。调用_M_erase_aux方法删除迭代器指向的元素 , 并且节点数目减一 。
void _M_erase_aux(const_iterator __position) { _Link_type __y = static_cast<_Link_type>(_Rb_tree_rebalance_for_erase (const_cast<_Base_ptr>(__position._M_node), this->_M_impl._M_header)); _M_drop_node(__y); --_M_impl._M_node_count; }
查找函数count统计元素个数count函数是用来统计一个元素在当前容器内的个数 。由于Map的特性 , 所以只能返回1或者0 。
/* * 用count函数寻找元素 , * */void find1(set<int> s ){ if (s.count(4) == 1) { cout << "元素4存在"<<endl; } if (s.count(8) == 0) { cout << "元素8不存在"; }}
推荐阅读
- 惠普战系列台式机评测 惠普台式电脑怎么样
- 沈月|盘点“致我们系列”六大主演现状,5人成了流量演员,1人不再拍戏
- 战神|推翻一切的新《战神》系列,续作还能带来惊喜吗?
- 美剧|网飞出品的6部黄暴系列美剧,一口气看完真过瘾
- 生化危机全系列剧情解析 生化危机电影剧情
- 美剧系列剧哪部好看,看看有什么好看的美剧-
- 姐姐|网络美女系列;乃木坂最漂亮的姐姐–卫藤美彩
- 为什么猎鹰系列发展迅速
- 主持人|“重启”系列续作电影《重启之深渊疑冢》今日上线 高能探险精彩升级
- 雅诗兰黛红石榴系列合适年纪是什么? 雅诗兰黛红石榴系列