C++ 在使用函数时删除重复元素";删除“;
我试图通过函数C++ 在使用函数时删除重复元素";删除“;,c++,algorithm,vector,C++,Algorithm,Vector,我试图通过函数vectoremove从算法库中使用函数remove从向量中删除重复的元素,但它不起作用: #include <iostream> #include <vector> #include <algorithm> #include <string> using namespace std; void vectorremove(vector<string> v) { for (vector<string>:
vectoremove
从算法库中使用函数remove
从向量中删除重复的元素,但它不起作用:
#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;
}
#包括
#包括
#包括
#包括
使用名称空间std;
void向量remove(向量v)
{
for(vector::iterator it=v.begin();it!=v.end();++it)
{
向量::迭代器end=remove(it+1,v.end(),*it);
v、 擦除(end,v.end());
}
}
int main()
{
向量向量;
字符串x;
而(cin>>x)
{
向量推回(x);
}
vectorremove(vect);
for(vector::iterator it=vect.begin();it!=vect.end();++it)
{
cout代码中的第一个问题是,您通过值传递向量,而不是通过引用vectoremove
。您需要将其更改为
void vectorremove(vector<string>& v);
首先,您通过值传递std::vector
,而不是通过引用。因此,您在vectoremove
函数中所做的任何更改都不会在main
中可见。
此外,std::vector::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());
}
您的代码可能如下所示:
void vectorremove(std::vector&v){
自动结束{v.end()};
for(自动it=v.begin();it!=end;++it)
{
结束=标准::移除(它+1,结束,*它);
}
v、 擦除(end,v.end());
}
注意使用auto代替std::vector::iterator
然而,STL提供了方便的函数来实现您想要的功能
从每个连续的元素组中删除除第一个元素以外的所有元素
范围[first,last]中的等效元素,并返回
超过范围的新逻辑结束的结束迭代器
要从std::vector
中删除重复项,可以执行以下操作:
#包括
#包括
#包括
int main(){
向量v{1,2,3,1,2,3,3,4,5,4,5,6,7};
std::sort(v.begin(),v.end());//1 2 3 3 4 5 6 7
auto last=std::unique(v.begin(),v.end());
v、 擦除(最后,v.end());
用于(自动常数i:v){
std::cout您只需修改向量的副本,就必须通过引用来修改实际的
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';
}
}
#包括
#包括
#包括
std::vector RemovedUpplicate(std::vector&v){
std::vec;
std::sort(std::begin(v),std::end(v));
自动pos=std::unique(std::begin(v),std::end(v));
向量分配(标准::开始(v),位置);
返回向量;
}
int main(){
向量向量{“约翰”、“约翰”、“保罗”、“约翰”、“露西”、“鲍勃”、“鲍勃”};
auto pureVector=移除的副本(vect);
用于(自动常量&v:pureVector){
std::couterase
操作使其无效,而不是执行++it
操作,您应该使用erase
的返回值,并且您还可以通过值将向量传递给vectorremove函数,因此main
中的vect
是无效的unchanged@M.M你能详细说明一下如何使用 >擦除< /代码>而不是<代码> +> IT <代码>?有什么阻止您打开C++书的章节,它告诉您如何使用<代码>擦除< /代码>(),并阅读使用<代码> Erasee()的示例。的返回值,是自己的吗?这是一个基本的东西,应该在每一本C++书籍中解释,StActOfFultU.com不是C++书籍的替代品。查找“擦除删除习惯用法”。或者阅读文档<代码>矢量::擦除< /代码>