C++ 设置存储混乱
我已经声明了一个类似于:C++ 设置存储混乱,c++,stl,set,C++,Stl,Set,我已经声明了一个类似于: struct data{ vector<string> att; string ds; }; struct数据{ 向量att; 字符串ds; }; 现在有一个集合来存储来自多个数据元素的唯一数据 set<data> s; set; 基于不同的矢量att和字符串ds 如何做到这一点?在不知道如何比较结构的情况下,您可以尝试以下方法: struct data { vector<string> att;
struct data{
vector<string> att;
string ds;
};
struct数据{
向量att;
字符串ds;
};
现在有一个集合来存储来自多个数据元素的唯一数据
set<data> s;
set;
基于不同的矢量att
和字符串ds
如何做到这一点?在不知道如何比较结构的情况下,您可以尝试以下方法:
struct data
{
vector<string> att;
string ds;
friend bool operator < (const data& lhs, const data& rhs)
{
if (std::lexicographical_compare(lhs.att.begin(), lhs.att.end(), rhs.att.begin(), rhs.att.end()))
{
return true;
}
else if (std::lexicographical_compare(rhs.att.begin(), rhs.att.end(), lhs.att.begin(), lhs.att.end()))
{
return false;
}
else
{
return lhs.ds < rhs.ds;
}
}
};
struct数据
{
向量att;
字符串ds;
friend bool运算符<(常量数据和左侧、常量数据和右侧)
{
if(std::词典编纂的比较(lhs.att.begin(),lhs.att.end(),rhs.att.begin(),rhs.att.end())
{
返回true;
}
else if(std::lexicographical_compare(rhs.att.begin()、rhs.att.end()、lhs.att.begin()、lhs.att.end())
{
返回false;
}
其他的
{
返回左S.ds<右S.ds;
}
}
};
我对这个解决方案不满意,因为它执行两次词典比较,这是低效的。希望有人能提出更好的解决方案
基本思想是,对于每个成员,比较左<右。如果为true,则返回true,否则比较right
std::tie
)
std::string
和std::vector
已具有操作您需要某种方法来比较数据
元素。您可以通过重写运算符或@Cornstalks的可能重复项来完成此操作。您可以为这个特殊情况提供比较函数的代码吗?@Cornstalks我不知道。这能解决如何比较向量的问题吗?那会复制向量吗?
struct data{
vector<string> att;
string ds;
operator<(const data& other) {
// Be sure to #include <tuple> for std::tie
return std::tie(att, ds) < std::tie(other.att, ds);
// If you don't want to (or can't) use std::tie, you can do this:
// return att < other.att || (att == other.att && ds < other.ds);
}
};
std::set<data> my_set; // Now it works.
struct Compare {
bool operator()(const data& left, const data& right) const {
return std::tie(left.att, left.ds) < std::tie(right.att, right.ds);
// Again, if you don't want to (or can't) use std::tie, you can do this:
// return left.att < right.att || (left.att == right.att && left.ds < right.ds);
}
};
std::set<data, Compare> my_set; // Now it works.