如何高效的从 std::vector 中 删除子集 std::vector
时间: 2023-12-14 22:04:26 浏览: 120
要效地从std::vector中删除子集std::vector,你可以使用erase-remove idiom。这种方法结合了erase函数和std::remove算法来实现。具体步骤如下:
1. 使用std::remove算法将要删除的子集移动到向量的末尾。
2. 使用erase函数从向量中删除子集的位置开始到向量的末尾的所有元素。
下面是一个示例代码:
```cpp
std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9};
std::vector<int> subset = {2, 4, 6};
vec.erase(std::remove(vec.begin(), vec.end(), subset.begin()), vec.end());
```
在上面的示例中,subset是要删除的子集,我们首先使用std::remove算法将subset中的元素移到了向量的末尾,然后使用erase函数从vec中删除这些元素。
相关问题
std::vector 分割 std::vector 子集
std::vector是C++标准库中的一个容器类,它可以动态地调整存储空间大小,并且能够自动处理内存分配和释放。对于分割std::vector成子集,我们可以使用vector的迭代器和算法库中的函数来实现。以下是分割std::vector的两种常用方法:
方法一:使用std::partition函数将vector分割成两个子集,满足某个特定的条件
```c++
#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8};
auto it = std::partition(vec.begin(), vec.end(), [](int i){return i%2==0;});
std::vector<int> even_vec(vec.begin(), it);
std::vector<int> odd_vec(it, vec.end());
for(auto i : even_vec)
std::cout << i << " ";
std::cout << std::endl;
for(auto i : odd_vec)
std::cout << i << " ";
std::cout << std::endl;
return 0;
}
```
方法二:使用std::copy_if函数将vector中满足某个特定条件的元素复制到另一个vector中
```c++
#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8};
std::vector<int> even_vec;
std::copy_if(vec.begin(), vec.end(), std::back_inserter(even_vec), [](int i){return i%2==0;});
std::vector<int> odd_vec;
std::copy_if(vec.begin(), vec.end(), std::back_inserter(odd_vec), [](int i){return i%2!=0;});
for(auto i : even_vec)
std::cout << i << " ";
std::cout << std::endl;
for(auto i : odd_vec)
std::cout << i << " ";
std::cout << std::endl;
return 0;
}
```
std::vector 去除另一个 std::vector 子集
要去除另一个 std::vector 的子集,可以使用 STL 中的 std::remove_if 算法结合 lambda 表达式来实现。具体步骤如下:
1. 使用 std::sort 对两个 vector 进行排序。
2. 使用 std::unique 对两个 vector 去重。
3. 使用 std::remove_if 结合 lambda 表达式,删除子集中的元素。
4. 使用 std::vector 的 erase 方法删除被删除的元素。
以下是示例代码:
```
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec1 { 1, 2, 3, 4, 5, 6, 7 };
std::vector<int> vec2 { 2, 4, 6 };
// 排序并去重
std::sort(vec1.begin(), vec1.end());
std::sort(vec2.begin(), vec2.end());
vec1.erase(std::unique(vec1.begin(), vec1.end()), vec1.end());
vec2.erase(std::unique(vec2.begin(), vec2.end()), vec2.end());
// 删除子集中的元素
auto it = std::remove_if(vec1.begin(), vec1.end(), [&vec2](int i) {
return std::binary_search(vec2.begin(), vec2.end(), i);
});
vec1.erase(it, vec1.end());
// 输出结果
for (int i : vec1) {
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}
```
阅读全文