使用函数"remove"删除重复元素
Removing duplicate elements in using the function "remove"
我试图使用算法库中的函数remove
通过函数vectorremove
从向量中删除重复元素,但它不起作用:
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
void vectorremove(vector<string> v)
{
for (vector<string>::iterator it = v.begin(); it != v.end(); ++it)
{
vector<string>::iterator end = remove(it + 1, v.end(), *it);
v.erase(end, v.end());
}
}
int main()
{
vector<string> vect;
string x;
while (cin >> x)
{
vect.push_back(x);
}
vectorremove(vect);
for (vector<string>::iterator it = vect.begin(); it != vect.end(); ++it)
{
cout << *it << endl;
}
return 0;
}
我写了这段代码来测试函数是否vectorremove
工作,不幸的是,vectorremove
似乎对向量没有影响。我在vectorremove
的定义中使用remove
是否有任何错误?
代码中的第一个问题是按值传递向量,而不是通过引用vectorremove
。您需要将其更改为
void vectorremove(vector<string>& v);
然后在您的vectorremove
函数中,您遇到了另一个问题。vector::erase
可以使所有迭代器失效,因此您应该在循环内remove
,并在循环后执行erase
。
void vectorremove(vector<string>& v)
{
vector<string>::iterator end{ v.end() };
for (vector<string>::iterator it = v.begin(); it != end; ++it)
{
end = remove(it + 1, end, *it);
}
v.erase(end, v.end());
}
首先,您按值传递std::vector
,而不是按引用传递。因此,您在vectorremove
函数中所做的任何更改都不会在main
中可见。 此外,std::vector::erase
可能会使迭代器失效,因此您不得在循环中使用它。
您的代码可能如下所示:
void vectorremove(std::vector<std::string>& v) {
auto end{ v.end() };
for (auto it = v.begin(); it != end; ++it)
{
end = std::remove(it + 1, end, *it);
}
v.erase(end, v.end());
}
请注意使用auto而不是std::vector<std::string>::iterator
。
但是,STL提供了方便的功能来实现您想要的功能。其中之一是std::unique
从每个连续的组中消除除第一个元素之外的所有元素 范围 [first, last) 中的等效元素并返回 范围的新逻辑结束的过去迭代器。
为了从std::vector
中删除重复项,您可以执行以下操作:
#include <iostream>
#include <algorithm>
#include <vector>
int main() {
std::vector<int> v{ 1, 2, 3, 1, 2, 3, 3, 4, 5, 4, 5, 6, 7 };
std::sort(v.begin(), v.end()); // 1 1 2 2 3 3 3 4 4 5 5 6 7
auto last = std::unique(v.begin(), v.end());
v.erase(last, v.end());
for (auto const i : v) {
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}
请记住,std::unique
仅在排序std::vector
上按预期工作。
你只修改向量的副本,你必须通过引用传递来修改实际的 vector,为什么不使用 auto 而不是 std::vector::iterator。你必须 知道擦除会使指向擦除元素的所有迭代器无效,并且 除了擦除元素之外,通过使用 erase 的返回值保持迭代器有效,还可以在循环中使用 std::getline 来存储来自 std::cin 的值以包含新行。
或者,您可以使用 std::unique 删除重复值并在对元素进行排序后按预期工作。 和 std::unique 返回范围的新逻辑结束的结束迭代器:-
#include <vector>
#include <algorithm>
#include <string>
std::vector<std::string> removeDuplicate(std::vector<std::string> & v){
std::vector<std::string> vec;
std::sort(std::begin(v), std::end(v));
auto pos = std::unique(std::begin(v), std::end(v));
vec.assign(std::begin(v), pos);
return vec;
}
int main(){
std::vector<std::string> vect{"John", "John", "Paul", "John", "Lucy", "Bob", "Bob"};
auto pureVector = removeDuplicate(vect);
for(auto const & v : pureVector){
std::cout << v << 'n';
}
}
- C++如何通过用户输入删除列表元素
- 使用函数"remove"删除重复元素
- 如何通过 getter 函数删除矢量的元素?
- 从控制台中删除最后打印的元素
- 如何从存储在std::映射中的std::集中删除元素
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 删除列表中的第n个元素
- 从矢量中删除元素后出现隔离错误
- 删除映射和分割错误中的一个过去结束元素
- 如何使用remove_if从矢量中删除元素
- 如何从使用 for 循环中的矢量大小的矢量中删除元素
- 从矢量中删除空元素
- 关于比较两个无序数组并删除 a[] 中可以在 b[] 中找到的元素的问题
- 删除指针数组 (C++) 中的元素
- 删除列表 c++ 中的最后 3 个元素
- 比较 2 个向量并从第二个向量中删除在第一个 - c++ 中找不到的元素
- 为什么通过 vector<reference_wrapper> 的元素删除引用的值<T>不会使向量无效?
- 从std::multiset的第i个元素删除到末尾
- 删除 [] 是否等于每个元素删除.C++
- std::列出元素删除后节点的内存回收