如何对向量的向量进行排序和应用唯一?



我只需要在一个向量中保留唯一的数组。我不知道怎么用std算法来做。我尝试了不同的方法,但都不起作用。

代码:

<标题>
include <iostream>
#include <vector>
#include <array>
#include <algorithm>
using vec3 = std::array<int,3>;
struct vec3comp{
bool operator()(const vec3 &lhs, const vec3 &rhs){
return lhs[0]< rhs[0] && lhs[1] < rhs[1] && lhs[2] < rhs[2];
}
} mycomp;
int main(){
std::vector<std::array<int,3>>vec;

vec.push_back({1,2,3});
vec.push_back({1,3,2});
vec.push_back({2,1,3});
vec.push_back({1,3,3});
vec.push_back({1,2,3});
vec.push_back({1,2,4});
vec.push_back({2,4,5});
vec.push_back({3,5,6});
vec.push_back({4,5,6});
vec.push_back({5,4,6});
vec.push_back({6,4,5});
vec.push_back({5,4,3});
vec.push_back({5,4,2});
vec.push_back({5,4,6});
vec.push_back({2,4,5});
vec.push_back({3,5,6});
vec.push_back({1,3,3});
vec.push_back({2,1,3});
//How should be the comp function 


std::sort(vec.begin(),vec.end(),mycomp);
for(auto i(0);i<vec.size();++i){
std::cout<<vec.at(i)[0]<<" "<<vec.at(i)[1]<<" "<<vec.at(i)[2]<<std::endl;
}
//apply unique on vec after sort
std::cout<<vec.size()<<std::endl;

return 0;
}

经过排序和唯一后,数组的向量应为:

{{1,2,3},{1,2,4},{1,3,2},{1,3,3},{2,1,3},{2,4,5},{3,4,5},{3,5,6},{4,5,6},{5,4,2},{5,4,3},{5,4,6},{6,4,5}}

有人能帮我解决这个问题吗?Thanks in advance

使用std::set应该可以解决您的问题

std::set<vec3> s{vec.begin(),vec.end()};
vec.assign(s.begin(),s.end());

你也可以添加一个自定义的比较类作为模板参数

<algorithm>中有一个函数std::unique用于删除所有相同的连续元素,因此在排序之后使用它来删除所有多余的元素非常简单

那么你的代码可能看起来像这样

std::vector<std::array<int,3>>vec;

vec.push_back({1,2,3});
vec.push_back({1,3,2});
vec.push_back({1,2,3});
//and so on

std::sort(vec.begin(),vec.end(),mycomp);
//make all elements unique
auto it = std::unique(vec.begin(), vec.end());
vec.erase(it, a.end());
for(auto i(0);i<vec.size();++i){
std::cout<<vec.at(i)[0]<<" "<<vec.at(i)[1]<<" "<<vec.at(i)[2]<<std::endl;
}
std::cout<<vec.size()<<std::endl;

注:我假设在排序之后,所有相同的项将按顺序进行

最新更新