list 类提供了insert(),erase()函数,它们分别增加和删除一个位于迭代器位置的元素。

1,  insert()

iterator  insert(iterator pos,const T &vaule);
//在pos前插入vaule,返回新元素的迭代器,不影响现有迭代器。

#include<iostream>
using namespace std;
#include<list>
int main(void)
{
int a[]={,,,,};
list<int> intList(a,a+);
list<int>::iterator iter,newIter;
iter=intList.begin();
newIter=intList.insert(iter,);
cout<<"newIter指向:"<<*newIter<<endl;
cout<<"iter指向:"<<*iter<<endl;
getchar();
}

运行结果:

在表的首元素插入数据元素0,newIter指向新插入的0,iter还是指向原来的1

2,  erase()

void erase(iterator pos);
//删除pos指向的元素,删除后pos指向未知

#include<iostream>
using namespace std;
#include<list>
int main(void)
{
int a[]={,,,,};
list<int> intList(a,a+);
list<int>::iterator iter,newIter;
iter=intList.begin();
intList.erase(iter);
cout<<"iter指向:"<<*iter<<endl;//会报运行时错误
getchar();
}

运行结果:

删除表的首元素,表少了一个元素,但是iter却指向了未知,这不是我们期望的!

故我们可以使用

erase(iter++) 代替 erase(iter)

erase(iter++)相当于把迭代器当前的值给erase的参数,同时又将迭代器iter指向下一个元素。

#include<iostream>
using namespace std;
#include<list>
int main(void)
{
int a[]={,,,,};
list<int> intList(a,a+);
list<int>::iterator iter,newIter;
iter=intList.begin();
intList.erase(iter++);
cout<<"iter指向:"<<*iter<<endl;//会报运行时错误
getchar();
}

运行结果:

3, insert()和erase()使用

/*
原始数组: 1 2 3 4 5
期望输出1:1 1 2 2 3 3 4 4 5 5
期望输出2:3 3 4 4 5 5 函数 doubleData()使用insert()实现数据元素重复
函数 eraseSmallVaule()使用erase()实现删除比3小的数据元素
函数 print()遍历list,输出list的信息
*/ #include<iostream>
using namespace std;
#include<list>
template<typename T>
void print( list<T> &alist);
template<typename T>
void doubleData(list<T> &alist);
template<typename T>
void eraseSmallVaule(list<T> &alist,T vaule);
int main(void)
{
int a[]={,,,,};
list<int> intList(a,a+);
cout<<"原始list是:";
print(intList); doubleData(intList);
cout<<"doubleData()后list是:";
print(intList);
cout<<"删除比3小的元素后list是:";
eraseSmallVaule(intList,);
print(intList);
getchar();
}
template<typename T>
void print( list<T> &alist)
{
list<T>::iterator iter;
iter=alist.begin();
while(iter!=alist.end())
{
cout<<*iter<<" ";
iter++;
}
cout<<endl;
}
template<typename T>
void doubleData(list<T> &alist)
{
list<T>::iterator iter,newIter;
iter=alist.begin();
while(iter!=alist.end())
{
newIter=alist.insert(iter,*iter);
iter++;
}
}
template<typename T>
void eraseSmallVaule(list<T> &alist,T vaule)
{
list<T>::iterator iter;
iter=alist.begin();
while(iter!=alist.end())
{
if(*iter<vaule)
{
alist.erase(iter++);
}
else
iter++;
}
}

运行结果:

STL list 的insert()和erase()的更多相关文章

  1. 编写一个函数,接受三个string参数,s,oldVal和newVal。使用迭代器及insert和erase函数将s中所有oldVal替换为newVal。测试你的程序,用他替换通用的简写形式,如,将“tho”,将“”“”

    // test14.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  2. insert erase和replace的例子

    9.43 编写一个函数,接受三个string参数s.oldVal和newVal.使用迭代器及insert和erase函数将s中所有oldval替换为newVal.测试程序,用它替换通用的简写形式,如, ...

  3. STL:remove和erase区别

    C++ STL中的remove和erase函数曾经让我迷惑,同样都是删除,两者有什么区别呢? vector中的remove的作用是将等于value的元素放到vector的尾部,但并不减少vector的 ...

  4. STL set 用法

      c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器.set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. ...

  5. c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例

    c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器.set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. 1 ...

  6. C++ std::map::erase用法及其陷阱

    1.引入: STL的map中有一个erase方法用来从一个map中删除制定的节点 eg: map<string,string> mapTest; typedef map<string ...

  7. stl学习(三)crope的用法

    转载自http://blog.csdn.net/iamzky/article/details/38348653 曾经我不会写平衡树……于是在STL中乱翻……学到了pb_ds库中的SXBK的斐波那契堆. ...

  8. STL标准库面试常考知识点

    C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作.vecto ...

  9. C++ STL 迭代器失效问题

    之前看<C++ Primier>的时候,也解到在顺序型窗口里insert/erase会涉及到迭代器失效的问题,并没有深究.今天写程序的时候遇到了这个问题. 1 莫名其妙的Erase 最初我 ...

随机推荐

  1. linux上的用户管理

    作为一个专业的服务器发行版,CentOS上存在着n多个用户,作为一个专业的运维工程师,linux的用户管理和用户组的管理是做为一个SA必不可少的工作. 下面我们就先来谈谈linux中的用户管理: us ...

  2. ABP官方文档翻译 3.5 规约

    规约 介绍 示例 创建规范类 使用仓储规约 组合规约 讨论 什么时候使用? 什么时候不使用? 介绍 规约模式是一种特别的软件设计模式,通过使用布尔逻辑将业务规则链接起来重新调配业务规则.(维基百科). ...

  3. JetBrains Pycharm 破解+汉化

    准备材料: 1.JetBrains Pycharm    传送门:  https://pan.baidu.com/s/1qZCpIR6 密码: rvrn 2.JetbrainsCrack-2.6.2. ...

  4. RandomAccess接口的使用

    RandomAccess在类Collections的shuffle()方法中的使用:(jdk源码如下) /** * Randomly permute the specified list using ...

  5. HDU 1384 Intervals &洛谷[P1250]种树

    差分约束 差分约束的裸题,关键在于如何建图 我们可以把题目中给出的区间端点作为图上的点,此处应注意,由于区间中被标记的点的个数满足区间加法,这里与前缀和类似,对于区间[L..R]来说,我们加入一条从L ...

  6. Vigenère 密码

    略简单的字符串+模拟. 原题链接:https://www.luogu.org/problem/show?pid=1079#sub 如果你对那个图感到懵逼,那属于正常,但没关系,这个图其实作用不大,我们 ...

  7. 【原】font-awesome IE6支持代码本人测试成功

    <!--[if (gte IE 6)&(lte IE 8)]> <script type="text/javascript" src="js/n ...

  8. offset / scroll / client Left / Top

    1.offsetHeight / Width (只读) offsetHeight:表示该元素在垂直方向占用的空间大小,包含元素的高度+上边框高度+下边框高度 offsetWidth:表示该元素在水平方 ...

  9. .NET图表控件(LightningChart )的用法

    概述 LightningChart (LightningChart Ultimate) 软件开发工具包是微软Visual Studio 的一个插件,专攻大数据可视化呈现问题,用于 WPF(Window ...

  10. php语言基础(一)

    一.php标记风格 1.1xml风格(常用) <?php echo "xml风格": ?> 1.2脚本风格 <script language="php& ...