【问题标题】:How to use insert in the set in c++ for user defined data type?如何在 C++ 中的集合中使用插入用户定义的数据类型?
【发布时间】:2016-10-14 06:28:57
【问题描述】:

我想使用set<vector<data>>,其中data 是用户定义的类,setvector 都是STL

class  data  
{  
    int info;  
};  

我不明白我们是否需要为vector<data>data 类或仅data 类定义比较器 运算符。 以及我们如何定义 comarator 操作符?

【问题讨论】:

  • 你真的想要一组数据向量吗?你为什么要这么做?
  • 一个集合需要知道两个元素是否相同,因为它不会存储重复项(因为它们是相同的东西)。所以你必须提供一种方法来判断两个向量是否相同,这不是一个向量通常会做的事情。这尖叫着你没有做正确的事情。
  • 这里有一股 XY 问题的味道
  • 如果std::vector的默认顺序不合适,你需要自己定义。你总是需要为你自己的类定义一个排序。
  • 如果您可以定义两个向量何时/应该被视为重复,那么只有我认为向量集才有意义。你能想到任何实际的例子吗?

标签: c++ vector data-structures set


【解决方案1】:

std::vector 已经有一个排序 - 字典顺序 - 所以你通常不需要做任何事情。

如果你使用默认的向量排序,你总是需要为你自己的类定义一个排序(参见下面的例子,你不需要),最常见的方法是重载operator<

注意排序关系必须是strict weak ordering,否则使用集合是未定义的。

如果你想给集合一个特殊的“平等”感,你需要定义你自己的。

例如,此代码将创建一个集合,其中相等长度的向量被视为相等(因此只有每个长度遇到的第一个向量被添加到集合中):

template<typename T>
struct shorter_vector
{
    bool operator() (const std::vector<T>& left, const std::vector<T>& right) const
    {
        return left.size() < right.size();
    }

};

// ...
struct A { int x; };
std::set<std::vector<A>, shorter_vector<A>> samelengths;
samelengths.insert({A{1}});
samelengths.insert({A{2}});
samelengths.insert({A{3},A{4}});
samelengths.insert({A{5},A{67}});
// set now contains {A{1}} and {A{3},A{4}}

请注意,此集合不需要对向量的元素进行排序,因为等价关系仅在结构上定义。

【讨论】:

    猜你喜欢
    • 2017-09-23
    • 2022-11-17
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    • 2019-11-09
    • 1970-01-01
    相关资源
    最近更新 更多