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.