Effective STL--不同容器删除特定元素的方法

输入迭代器是每个迭代位置智能被读一次的只读迭代器。输出迭代器是每个迭代位置只能被写一次的只写迭代器。输入和输出迭代器被塑造为读和写输入和输出流。前向迭代器有输入和输出迭代器的能力,但是他们可以反复读或写一个位置。它们不支持operator--,所以他们可以高效地向前移动任意次数。所有的标准STL容器都支持比前向迭代器更强大的迭代器。散列容器是前向迭代器,单链表容器也提供前向迭代器

双向迭代器就想前向迭代器,除了他们的后退尅像前进一样容易。标准关联容器都提供双向迭代器。List也有。

随机访问迭代器可以做双向迭代器做的一切事情,但他们也提供“迭代器算术”,有一步向前或向后跳的能力。Vector string deque都提供随机访问迭代器。指针数组的指针可以作为数组的随机访问迭代器。

对于deque迭代器失效的情况:

1、  在deque容器首部或者尾部插入元素不会使得任何迭代器失效。

2、  在其收不或尾部删除元素则只会使指向被删除元素的迭代器失效

3、  在deque容器的任何其他位置的插入和删除操作将使指向该容器元素的所有迭代器失效

容器容纳了对象,但不是你给他们的那个对象。此外,当你从容器中获取一个对象时,你所得到的的对象不是容器里的那个对象。取而代之的是,当你想容器中添加一个对象,静茹容器的是你指定的对象的拷贝。

在容器中删除元素的分类情况:

1、去除一个容器总特定值的所有对象:

如果容器是vector string或deque,使用erase-remove惯用法

c.erase(remove(c.begin(),c.end(),1999),c.end());//当c时vectorstring deque时,erase-remove惯用法是去除特定值的元素

如果容器是list,使用list::remove

c.remove(1999); //当c时List时,remove成员函数是去除特定值的元素的最佳方法

如果容器是标准关联容器,使用它的erase成员函数

c.erase(1999);//当c时标准关联容器时erase成员函数是去除特定值的元素的最佳方法

2、去除一个容器中满足一个特定判定式的所有对象:

如果容器是vector string或deque,使用erase-remove_if惯用法

c.rease(remove_if(c.begin(),c.end(),badvalue),c.end());//当c时vectorstring deque时这样是去掉badbale返回值为真的对象的最佳方法

如果容器是list 使用list::remove::if

c.remove_if(badvalue);//当c时list时这是去掉badvalue返回值为真的对象的最佳方法

如果容器是标准关联容器,使用remove_copy_if和swap,或写一个循环来遍历容器元素,当你吧迭代器传给erase时记得后置递增它

For(container<int>::iterator I =c.begin();i!=c.end();)

{

If(badvalue(*i))c.erase(i++);

Else++I;

}

//for循环的第三部分是空的,在下面自增

在循环内做某些事情(除了删除对象之外):

如果容器是标准序列容器,写一个循环来遍历容器元素,每当调用erase时记得都用它的返回值更新你的迭代器

如果标准容器是标准关联容器,写一个循环来遍历容器元素,当你把迭代器传给erase时记得后置递增它。

时间: 2024-12-25 11:27:33

Effective STL--不同容器删除特定元素的方法的相关文章

Effective STL: 不同容器删除元素的方法

不同容器删除元素的方法 去除一个容器中有特定值的所有对象: 如果容器是vector.string或deque,使用erase-remove惯用法. 如果容器是list,使用list::remove. 如果容器是标准关联容器,使用它的erase成员函数. 去除一个容器中满足一个特定判定式的所有对象: 如果容器是vector.string或deque,使用erase-remove_if惯用法. 如果容器是list,使用list::remove_if. 如果容器是标准关联容器,写一个循环来遍历容器元素

C#遍历List并删除某个元素的方法

C#遍历List并删除某个元素的方法,你的第一反应使用什么方法实现呢?foreach? for? 如果是foreach,那么恭喜你,你答错了.如果你想到的是用for,那么你只是离成功进了一步. 正确的做法是用for倒序遍历,根据条件删除.下面我们用代码来演示foreach,for删除list数据的情况: class Program { public class Students { public string Name { get; set; } public int Age { get; se

jquery数组删除指定元素的方法:grep()

jquery数组删除指定元素的方法:grep() 金刚 数组 jquery javascript 元素 遇到的问题 今天遇到一个问题,删除数组中的一个指定元素,并返回新的数组. 我定义的js数组是这样的: var sexList=new Array[3]; sexList[0]="1"; sexList[1]="2"; sexList[2]=""; 想达到的效果 我想达到的效果是这样的: 删除索引=1的元素,并返回新数组. 返回的结果是: var

Effective STL --关联容器

高效STL-关联容器 标准关联容器中最重要的就是基于等价而不是相等.比如对于基本的函数库有find函数,但是对于set关联容器也是有find成员函数的.因为标准关联容器保持有序,所以每一个容器必须有一个定义了怎么保持东西有序的比较函数(默认是less).等价是根据这个比较函数定义的,所以标准关联容器的用户只需要为他们要使用的任意容器指定一个比较函数 必须为指针的关联容器指定比较类型 一定要明确对于一个容器来说,容器内的迭代器是存入该容器对象的指针,比如一个关联容器存入指针类型,那么使用这个容器的

Java集合类ArrayList循环中删除特定元素

在项目开发中,我们可能往往需要动态的删除ArrayList中的一些元素. 一种错误的方式: <pre name="code" class="java">for(int i = 0 , len= list.size();i<len;++i){ if(list.get(i)==XXX){ list.remove(i); } } 上面这种方式会抛出如下异常: Exception in thread "main" java.lang.I

每日总结 - Java集合类ArrayList删除特定元素

在这次的项目开发中遇到动态的删除ArrayList中的一些元素. 正确的做法是: 1 for(int i = 0, len = list.size(); i < len; i++){ 2 if(list.get(i) == 1){ 3 list.remove(i); 4 len--; 5 i--; 6 } 7 } 更好的一个做法: List接口内部实现了Iterator接口,提供开发者一个iterator()得到当前list对象的一个iterator对象.所以我们还有一个更好的做法是: 1 It

数据结构-链表实现删除全部特定元素x

链表节点类定义: 1 template <class T> 2 class SingleList; 3 template <class T> 4 class Node 5 { 6 private: 7 T element; 8 Node<T> *link; 9 friend class SingleList<T>; 10 }; 链表类定义: 1 template <class T> 2 class SingleList :public Linea

ES6数组中删除指定元素

知识点: ES6从数组中删除指定元素 findIndex()方法返回数组中满足提供的测试函数的第一个元素的索引.否则返回-1. arr.splice(arr.findIndex(item => item.id === data.id), 1) http://louiszhai.github.io/2017/04/28/array/ 1:js中的splice方法 splice(index,len,[item]) 注释:该方法会改变原始数组. splice有3个参数,它也可以用来替换/删除/添加数组

javascript 常见数组操作( 1、数组整体元素修改 2、 数组筛选 3、jquery 元素转数组 4、获取两个数组中相同部分或者不同部分 5、数组去重并倒序排序 6、数组排序 7、数组截取slice 8、数组插入、删除splice(需明确位置) 9、数组遍历 10、jQuery根据元素值删除数组元素的方)

主要内容: 1.数组整体元素修改 2. 数组筛选 3.jquery 元素转数组 4.获取两个数组中相同部分或者不同部分 5.数组去重并倒序排序 6.数组排序 7.数组截取slice 8.数组插入.删除splice(需明确位置) 9.数组遍历 10.jQuery根据元素值删除数组元素的方法 数组常见操作包含了 增.删.查.改.插入.交集.并集 1.数组整体元素修改 //map,给数组每个元素加1 输出[1,2,3] $.map([0,1,2],function(n){ return n+1; })