zoukankan      html  css  js  c++  java
  • 20180517 容器 迭代器

    以下代码实现了从表中删除重复项的功能,请选择其中空白行应填入的正确代码()
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    template<typename T>
    void removeDuplicates(list<T> &aList)
    {
        T curValue;
        list<T>::iterator cur, p;
        cur = aList.begin();
        while (cur != aList.end())
        {
            curValue = *cur;
            //空白行
            while (p != aList.end())
            {
                if (*p == curValue)
                {
                    //空白行
                }
                else
                {
                    p++;
                }
            }
        }
    }
     
    p=curr+1;aList.erase(p++);
    p=++curr;aList.erase(p++);
    p=curr+1;aList.erase(p);
    p=++curr;aList.erase(p);

    答案:B 错选:D
    当使用一个容器的insert或者erase函数通过迭代器插入或删除元素"可能"会导致迭代器失效
    iterator失效主要有两种情况:
    1、iterator变量已经变成了“野指针”,对它进行*,++,--都会引起程序内存操作异常;
    2、iterator所指向的变量已经不是你所以为的那个变量了。
    不同的容器,他们erase()的返回值的内容是不同的,有的会返回被删除元素的下一个的iterator,有的则会返回删除元素的个数。
    对于非结点类,如数组类的容器 vector,string,deque 容器标准写法是这样:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     //vector<int> m_vector;
     for(vector<int>::iterator iter = m_vector.begin(); iter != m_vector.end();)
    {
        if(需要删除)
        {
            iter=m_vector.erase(iter);
        }
        else
            ++iter;
    }
    数组型数据结构:该数据结构的元素是分配在连续的内存中,insert和erase操作,都会使得删除点和插入点之后的元素挪位置,所以,插入点和删除掉之后的迭代器全部失效,也就是说insert(*iter)(或erase(*iter)),然后在iter++,是没有意义的。解决方法:erase(*iter)的返回值是下一个有效迭代器的值。 iter =cont.erase(iter);
     
    对于结点类容器(如:list,map,set)是这样:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     //map<int,int> m_map;
    for(map<int,int>::iterator iter = m_map.begin(); iter != m_map.end(); )
    {
        if(需要删除)
        {
            m_map.erase(iter++);
        }
        else
            ++iter;
    }
    链表型数据结构:对于list型的数据结构,使用了不连续分配的内存,删除运算使指向删除位置的迭代器失效,但是不会失效其他迭代器.解决办法两种,erase(*iter)会返回下一个有效迭代器的值,或者erase(iter++).
     
    树形数据结构: 使用红黑树来存储数据,插入不会使得任何迭代器失效;删除运算使指向删除位置的迭代器失效,但是不会失效其他迭代器.erase迭代器只是被删元素的迭代器失效,但是返回值为void,所以采用erase(iter++)。
     
  • 相关阅读:
    show processlist 输出ID 和 information_schema.PROCESSLIST 的id,information_schema.innodb_trx的TRX_MYSQL_T
    用 Flask 来写个轻博客 (15) — M(V)C_实现博文页面评论表单
    第十二章 对象(下)
    十大最值得关注的国内大数据分析厂商
    第十二章 对象(上)
    mysql 区间锁 对于没有索引 非唯一索引 唯一索引 各种情况
    insert into select 堵塞update
    监控持有sql和被堵塞的sql
    人生应该有间隔年——北漂18年(75)
    ERROR: transport error 202: connect failed: Connection timed out
  • 原文地址:https://www.cnblogs.com/kxzh/p/9107557.html
Copyright © 2011-2022 走看看