Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在使用函数时删除重复元素";删除“;_C++_Algorithm_Vector - Fatal编程技术网

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::cout
erase
操作使其无效,而不是执行
++it
操作,您应该使用
erase
的返回值,并且您还可以通过值将向量传递给vectorremove函数,因此
main
中的
vect
是无效的unchanged@M.M你能详细说明一下如何使用 >擦除< /代码>而不是<代码> +> IT <代码>?有什么阻止您打开C++书的章节,它告诉您如何使用<代码>擦除< /代码>(),并阅读使用<代码> Erasee()的示例。的返回值,是自己的吗?这是一个基本的东西,应该在每一本C++书籍中解释,StActOfFultU.com不是C++书籍的替代品。查找“擦除删除习惯用法”。或者阅读文档<代码>矢量::擦除< /代码>