C++ 设置和 shared_ptr
c++ set and shared_ptr
我有 class X 喜欢:
class X {
public:
bool operator<(const SCN& other) const;
};
然后我有以下代码:
std::multiset<std::shared_ptr<X>> m;
我的问题是:
m中的数据是如何排序的? X(shared_ptr)
或 X.operator<
的地址?如果是按地址 X
订购,我怎样才能按 X.operator<
订购?
对于这个m
,如果我想从小到大访问它的元素,下面的代码能保证吗?如果没有,怎么办?
for (auto& i : m) {
f(i);
}
您的套装是根据您的 key_type 排序的,即 std::shared_ptr<X>
。因为你的 std::shared_ptr<X>
是 comparable, the ordering of the std::shared_ptr 为准。
为了便于参考,multiset定义为
template<
class Key,
class Compare = std::less<Key>,
class Allocator = std::allocator<Key>
> class multiset;
可以看出,typename Compare
是 std::less<Key>
并且 std::less 应该重载可能实现为
的函数重载
constexpr bool operator()(const T &lhs, const T &rhs) const
{
return lhs < rhs;
}
lhs
和 rhs
都是 T
类型,在本例中是 Key
,这是我们实例化多重集的类型 [=12] =].
我有 class X 喜欢:
class X {
public:
bool operator<(const SCN& other) const;
};
然后我有以下代码:
std::multiset<std::shared_ptr<X>> m;
我的问题是:
m中的数据是如何排序的?
X(shared_ptr)
或X.operator<
的地址?如果是按地址X
订购,我怎样才能按X.operator<
订购?对于这个
m
,如果我想从小到大访问它的元素,下面的代码能保证吗?如果没有,怎么办?for (auto& i : m) { f(i); }
您的套装是根据您的 key_type 排序的,即 std::shared_ptr<X>
。因为你的 std::shared_ptr<X>
是 comparable, the ordering of the std::shared_ptr 为准。
为了便于参考,multiset定义为
template<
class Key,
class Compare = std::less<Key>,
class Allocator = std::allocator<Key>
> class multiset;
可以看出,typename Compare
是 std::less<Key>
并且 std::less 应该重载可能实现为
constexpr bool operator()(const T &lhs, const T &rhs) const
{
return lhs < rhs;
}
lhs
和 rhs
都是 T
类型,在本例中是 Key
,这是我们实例化多重集的类型 [=12] =].