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不存在";    }}


推荐阅读