我有一个int
向量,最多包含4个元素,最少2个,例如:
std::vector<int> vectorDATA(X); // x means unknown here
我想要做的是删除重复的元素,例如:
vectorDATA{1,2,2} to vectorDATA{1,2}
vectorDATA{1,2,3} to nothing changes
vectorDATA{2,2,2} to vectorDATA{2}
vectorDATA{3,2,1,3} to vectorDATA{3,2,1}
vectorDATA{1,2,1,2} to vector{1,2}
等等
这里的代码很简单:
cv::HoughLines(canny,lineQ,1,CV_PI/180,200);
std::cout << " line Size "<<lineQ.size()<< std::endl;
std::vector<int> linesData(lineQ.size());
std::vector<int> ::iterator it;
if(lineQ.size() <=4 && lineQ.size() !=0 ){
if(lineQ.size()==1){
break;
}else {
for ( int i = 0; i<lineQ.size();i++){
linesData[i] = lineQ[i][1]; // my comparison parameter is the lineQ[i][1]
}
//基于我得到的答案我正在尝试这个但我真的不知道如何继续?
std::sort(lineQ.begin(),lineQ.end(),[](const cv::Vec2f &a,const cv::Vec2f &b)
{
return ????
}
我尝试使用for and do while
循环,但我没有得到它,而函数std::adjacent_find
这个条件是元素应该是连续的。
也许这很容易,但我只是不明白!
谢谢你的帮助 !
答案 0 :(得分:3)
简单的方法是排序然后唯一擦除,但这会改变顺序。
c ++ 11顺序保留方式是创建unordered_set<int> s;
并执行:
unordered_set<int> s;
vec.erase(
std::remove_if( vec.begin(),vec.end(), // remove from vector
[&](int x)->bool{
return !std::get<1>(s.insert(x)); // true iff the item was already in the set
}
),
vec.end() // erase from the end of kept elements to the end of the `vec`
);
这是使用unordered_set
检测重复项的删除 - 删除习惯用法。
答案 1 :(得分:1)
我没有在已经提到的答案中看到无排序的源代码,所以就这样了。用于检查重复项的哈希表,将唯一元素移向向量的前面,请注意src
始终为>= dst
,dst
是复制的数量,即最后的唯一元素。< / p>
#include <unordered_set>
#include <vector>
#include <iostream>
void
uniq (std::vector<int> &a) {
std::unordered_set<int> s;
size_t dst = 0;
for (size_t src = 0; src < a.size(); ++src) {
if (s.count (a[src]) == 0) {
s.insert (a[src]);
a[dst++] = a[src];
}
}
a.resize (dst);
}
int
main () {
std::vector<int> a = { 3, 2, 1, 3, 2, 1, 2, 3, 4, 5 ,2, 3, 1, 1 };
uniq (a);
for (auto v : a)
std::cout<< v << " ";
std::cout << std::endl;
}
答案 2 :(得分:1)
如果你想真正删除重复的元素,你可以尝试这样的事情:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main () {
int data[] = {1,2,3,2,1};
vector<int> vectorDATA = (&data[0], &data[0] + 5);
sort(vectorDATA.begin(),vectorDATA.end());
for(int i = 0; i < vectorDATA.size()-1; ++i)
{
if(vectorDATA[i] == vectorDATA[i+1])
vectorDATA.erase(vectorDATA.begin()+i+1);
}
for(int i = 0; i < vectorDATA.size();++i)
{
cout << vectorDATA[i] << " ";
}
cout << endl;
return 0;
}
缺乏这种方法就是元素丢失了他的命令。