我只需要在一个向量中保留唯一的数组。我不知道怎么用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;
注:我假设在排序之后,所有相同的项将按顺序进行