20180318 代码错题(7)

以下代码实现了从表中删除重复项的功能,请选择其中空白行应填入的正确代码()
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++)。


转载于:https://www.cnblogs.com/kxzh/p/8598208.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值