直接上代码
#include <iostream>
#include <vector>
#include <algorithm>
void print(std::vector<int> &v) {
for(const auto &value : v)
std::cout << value << " ";
std::cout << std::endl;
}
int main() {
// 删除指定元素
{
std::vector<int> v1{1, 2, 2, 3, 2, 2, 5};
v1.erase(std::remove(v1.begin(), v1.end(), 2));
print(v1);
std::vector<int> v2{1, 2, 2, 3, 2, 2, 5};
v2.erase(std::remove_if(v2.begin(), v2.end(), [](int value) {
return value == 2;
}));
print(v2);
// 以上两种方法并不是真正的删除,只是将后面的元素进行了移动
// 你还需要留意的是,虽然是元素简单的移动,但是移动前后,vector 的大小已经发生了变化
// 真正意义上的删除是以下的操作
std::vector<int> v3{1, 2, 2, 3, 2, 2, 5};
std::vector<int>::iterator it;
for(it = v3.begin(); it != v3.end();) {
if(*it == 2)
it = v3.erase(it); //删除元素,返回值指向已删除元素的下一个位置
else
++it; //指向下一个位置
}
print(v3);
// 下面的这个也是正确姿势
std::vector<int> v4{1, 2, 2, 3, 2, 2, 5};
auto last = v4.erase(std::remove(v4.begin(), v4.end(), 2));
v4.erase(last, v4.end());
print(v4);
}
// 将 vector 填充成某一元素
{
std::vector<int> v{1, 2, 2, 3, 2, 2, 5};
std::fill(v.begin(), v.end(), 6);
print(v);
}
// 复制前 N 个元素
{
std::vector<int> v{1, 2, 3, 4, 5, 6, 7};
std::vector<int> result;
std::copy_n(v.begin(), 5, std::back_inserter(result));
print(result);
}
// 求两个 vector 的差集
{
std::vector<int> v1{1, 2, 3, 4, 5, 6, 7}; // 有序
std::vector<int> v2{5, 4, 3};
// 注意要先对 v1 和 v2 进行排序
std::sort(v2.begin(), v2.end());
std::vector<int> result;
std::set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), std::inserter(result, result.begin()));
print(result);
}
// 元素去重
{
std::vector<int> v1{1, 2, 2, 3, 2, 2, 5};
std::unique(v1.begin(), v1.end());
print(v1);
// 和 std::remove 一样,并没有正真的删除元素,正确见下
std::vector<int> v2{1, 2, 2, 3, 2, 2, 5};
auto last2 = std::unique(v2.begin(), v2.end());
v2.erase(last2, v2.end());
print(v2);
// 你注意到其实还是有两个 2 ,所以需要先排序
std::vector<int> v3{1, 2, 2, 3, 2, 2, 5};
std::sort(v3.begin(), v3.end());
auto last3 = std::unique(v3.begin(), v3.end());
v3.erase(last3, v3.end());
print(v3);
}
return 0;
}
输出为
1 3 5 2 2 5
1 3 5 2 2 5
1 3 5
1 3 5
6 6 6 6 6 6 6
1 2 3 4 5
1 2 6 7
1 2 3 2 5 2 5
1 2 3 2 5
1 2 3 5