当前位置 博文首页 > haimianjie2012的专栏:STL::vector删除指定值的元素
remove由定义在 algorithm 头文件中的模板生成,所以要用它需要加上头文件#include?<algorithm>。
STL中remove()只是将待删除元素之后的元素移动到vector的前端,而不是删除。若要真正移除,需要搭配使用erase(),才能真正删除。
#include <iostream>
#include <vector>
#include < algorithm >
using namespace std;
int main()
{
vector<int> mv = { 1,2,3,5,4,6,7,5,9 };
auto it = remove(mv.begin(), mv.end(), 5);
auto it1 =mv.erase(it, mv.end());
}
添加运行结果:
#include <iostream>
#include <vector>
#include < algorithm >
using namespace std;
int main()
{
vector<int> mv = { 1,2,3,5,4,6,7,5,9 };
//vector<int> mv = { 1,2,3,5,4,6,7,5,9 };
cout << "my vector:" << endl;
for (auto tm = mv.begin(); tm != mv.end(); tm++)
{
cout << *tm << " ";
}
cout << endl;
auto it = remove(mv.begin(), mv.end(), 5);
cout << "after remove:" << endl;
if (it == mv.end())
{
for (auto tm = mv.begin(); tm != mv.end(); tm++)
{
cout << *tm << " ";
}
cout << endl;
}
else {
auto tm = mv.begin();
cout << "before iterator:" << endl;
for (; tm !=it; tm++)
{
cout << *tm << " ";
}
cout <<endl<< "after iterator:" << endl;
for (; tm != mv.end(); tm++)
{
cout << *tm << " ";
}
cout << endl;
}
auto it1 =mv.erase(it, mv.end());
cout << "after erase:" << endl;
if (it1 == mv.end())
{
for (auto tm = mv.begin(); tm != mv.end(); tm++)
{
cout << *tm << " ";
}
cout << endl;
}
else {
auto tm = mv.begin();
cout << "before iterator:" << endl;
for (; tm != it1; tm++)
{
cout << *tm << " ";
}
cout << "after iterator:" << endl;
for (; tm != mv.end(); tm++)
{
cout << *tm << " ";
}
cout << endl;
}
}
运行结果如下:
?
?
erase函数原型有两种形式:
iterator erase(iterator position);
iterator erase(iterator first, iterator last);
返回指向下一个元素的迭代器。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vec = { 1,2,3,5,4,6,7,5,9 };
cout << "befor del 5:" << endl;
for (auto tm = vec.begin(); tm != vec.end(); tm++)
{
cout << *tm << " ";
}
cout << endl;
for (auto it = vec.begin(); it != vec.end();)
{
if (5 == *it) {
it = vec.erase(it);
}
else {
++it;
}
}
cout << "after del 5:" << endl;
for (auto tm = vec.begin(); tm != vec.end(); tm++)
{
cout << *tm << " ";
}
cout << endl;
}
?运行结果:
?注意:
erase删除一个元素时,当前迭代器已经失效,需要让iterator迭代器指向下一个元素的迭代器,否则就会报错,自己可以试试,这里绝对是一个坑;
it = vec.erase(it);
函数的语法格式:
InputIterator find (InputIterator first, InputIterator last, const T& val);
其中,first 和 last 为输入迭代器,[first, last) 用于指定该函数的查找范围;val 为要查找的目标元素。
该函数适用于所有的序列式容器?
当 find() 函数查找成功时,其指向的是在 [first, last) 区域内查找到的第一个目标元素;如果查找失败,则该迭代器的指向和 last 相同。
头文件:
#include <algorithm> // std::find
注意string类也有一个find函数,与stl的find算法有些不同,大家可以读读:C++ string中的find()函数 - 王陸 - 博客园 (cnblogs.com)?
#include <iostream>
#include <vector>
#include < algorithm >
using namespace std;
//删除说有满足条件的元素
void Del_1();
int main()
{
vector<int> mv = { 1,2,3,5,4,6,7,5,9 };
auto it = find(mv.begin(), mv.end(), 5);
if (it != mv.end())
{
mv.erase(it);
}
}
添加打印信息:?
#include <iostream>
#include <vector>
#include < algorithm >
using namespace std;
//删除说有满足条件的元素
void Del_1();
int main()
{
vector<int> mv = { 1,2,3,5,4,6,7,5,9 };
//vector<int> mv = { 1,2,3,5,4,6,7,5,9 };
cout << "my vector:" << endl;
for (auto tm = mv.begin(); tm != mv.end(); tm++)
{
cout << *tm << " ";
}
cout << endl;
auto it = find(mv.begin(), mv.end(), 5);
cout << "after find:" << endl;
if (it == mv.end())
{
for (auto tm = mv.begin(); tm != mv.end(); tm++)
{
cout << *tm << " ";
}
cout << endl;
}
else {
auto tm = mv.begin();
cout << "before iterator:" << endl;
for (; tm != it; tm++)
{
cout << *tm << " ";
}
cout << endl << "after iterator:" << endl;
for (; tm != mv.end(); tm++)
{
cout << *tm << " ";
}
cout << endl;
}
if (it != mv.end())
{
auto it1=mv.erase(it);
cout << "after erase:" << endl;
if (it1 == mv.end())
{
for (auto tm = mv.begin(); tm != mv.end(); tm++)
{
cout << *tm << " ";
}
cout << endl;
}
else {
auto tm = mv.begin();
cout << "before iterator:" << endl;
for (; tm != it1; tm++)
{
cout << *tm << " ";
}
cout << endl << "after iterator:" << endl;
for (; tm != mv.end(); tm++)
{
cout << *tm << " ";
}
cout << endl;
}
}
}
运行结果:?
?
参考文献:
C++ find()函数用法详解(超级详细) (biancheng.net)
在vector中,怎样删除某个指定值的元素
cs