gpt4 book ai didi

c++ - C++设置容器的问题

转载 作者:太空宇宙 更新时间:2023-11-04 16:23:14 30 4
gpt4 key购买 nike

当我尝试编译以下代码时:

    #include <iostream>
#include <set>
#include <vector>

using namespace std;

template <class T, class S>
class Property
{
public:
pair<T,S> p;

Property(T t, S s) { p = make_pair(t,s);}

};

int main()
{
set< Property<string, string> > properties;
Property<string, string> name("name", "Andy");

properties.insert(name);

}

我收到编译错误。但是,当我用 vector 替换 set 并因此使用 push_back 函数而不是 insert 函数时,一切正常。谁能解释我做错了什么?感谢您的建议。

最佳答案

std::set 将其值存储在排序的二叉树中,因此它需要知道如何比较它所持有的值。默认情况下它使用 std::less 作为比较函数,对于未专门化的用户定义类型,它会尝试调用 operator< .因此,告诉集合如何比较对象的最简单方法是定义一个 operator<。对于你的类(class):

template <class T, class S> 
class Property
{
public:
pair<T,S> p;

Property(T t, S s) { p = make_pair(t,s);}

bool operator<(const Property<T,S>& rhs) const
{
return p < rhs.p;
}
};

但是,还有其他方式可以告诉我们std::set如何比较你的类型。一种是专门研究 std::less类(class)模板:

namespace std {
template<typename T,typename S>
struct less<Property<T, S> >
{
bool operator()(const Property<T, S>& lhs, const Property<T,S>& rhs) const
{
return lhs.p < rhs.p;
}
};
}

另一种方法是用具有正确签名的函数或具有 operator() 的类替换默认比较类型。用正确的签名定义。这是事情开始变得丑陋的地方。

// Comparison function
template<typename T, typename S>
bool property_less_function(const Property<T,S>& lhs, const Property<T,S>& rhs)
{
return lhs.p < rhs.p;
}

// Comparison functor
template<typename T, typename S>
struct PropertyLess
{
bool operator()(const Property<T,S>& lhs, const Property<T,S>& rhs) const
{
return lhs.p < rhs.p;
}
};

int main()
{
// Set using comparison function.
// Have to pass the function pointer in the constructor so it knows
// which function to call. The syntax could be cleaned up with some
// typedefs.
std::set<Property<std::string, std::string>,
bool(*)(const Property<std::string, std::string>&,
const Property<std::string, std::string>&)>
set1(&property_less_function<std::string, std::string>);

// Set using comparison functor. Don't have to pass a value for the functor
// because it will be default constructed.
std::set<Property<std::string, std::string>, PropertyLess<std::string, std::string> > set2;
}

请记住,无论您使用什么小于函数,该函数都必须定义一个 strict weak ordering适合你的类型。

关于c++ - C++设置容器的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14784620/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com