Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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,我有一个包含如下数据的向量:15,27,40,50,15,40 我想对它进行排序并删除相同的值,因此排序后的输出应该是:15,27,40,50 我尝试过几种方法,例如: std::sort(vectProjHori.begin(),vectProjHori.end()); for (std::vector<int>::iterator it=vectProjHori.begin(); it!=vectProjHori.end(); ++it) { if(it+1 != it)

我有一个包含如下数据的向量:15,27,40,50,15,40

我想对它进行排序并删除相同的值,因此排序后的输出应该是:15,27,40,50

我尝试过几种方法,例如:

std::sort(vectProjHori.begin(),vectProjHori.end());
for (std::vector<int>::iterator it=vectProjHori.begin(); it!=vectProjHori.end(); ++it)
{
    if(it+1 != it)
    {
        std::cout << ' ' << *it;
    }
}
但是,它不能删除向量中的相同值。 我真的希望有人能给出一个有效的方法

任何帮助都将不胜感激。
谢谢你

它+1肯定不是它;您需要在比较之前先解除引用。

it+1肯定不是它;您需要先解除引用,然后再进行比较。

您可以使用标准函数进行解除引用

std::sort(vectProjHori.begin(), vectProjHori.end());
vectProjHori.erase(std::unique(vectProjHori.begin(), vectProjHori.end()), vectProjHori.end());

您可以使用标准函数来实现这一点

std::sort(vectProjHori.begin(), vectProjHori.end());
vectProjHori.erase(std::unique(vectProjHori.begin(), vectProjHori.end()), vectProjHori.end());

这将完成您的工作,但mwerschy上面的代码更好。C++11

#include <iostream>
#include <algorithm>
#include <iterator>


int main() { 

  std::vector<int> v={1,2,8,4,5,5};
  std::sort(v.begin(),v.end());
  auto it=std::unique(v.begin(),v.end());
  v.resize(std::distance(v.begin(),it));
  std::copy(v.begin(),v.end(),std::ostream_iterator<int>(std::cout,"\n"));

 }

这将完成您的工作,但mwerschy上面的代码更好。C++11

#include <iostream>
#include <algorithm>
#include <iterator>


int main() { 

  std::vector<int> v={1,2,8,4,5,5};
  std::sort(v.begin(),v.end());
  auto it=std::unique(v.begin(),v.end());
  v.resize(std::distance(v.begin(),it));
  std::copy(v.begin(),v.end(),std::ostream_iterator<int>(std::cout,"\n"));

 }

你可以用resize来做,虽然使用erase似乎是更明显的选择,但是,不是那些参数。你可以用resize来做,虽然使用erase似乎是更明显的选择,但是不是那些参数。愚蠢的我,我的错。。我不太清楚。。但是我很沮丧,我不知道其他方法怎么做。愚蠢的我,我的错。。我不太清楚。。但是我很沮丧,我不知道其他的方法。谢谢@mwerschy,这是迄今为止最简单的方法。谢谢@mwerschy,这是迄今为止最简单的方法。