创建一组指针以使用底层注入的比较标准,c++



我希望std::set如果shared_ptr's比较的是指针,而不是指针。
我有这样一个例子:

std::shared_ptr<std::string> s(new std::string("abc"));
std::shared_ptr<std::string> p(new std::string("abc"));
std::set<std::shared_ptr<std::string>> S;
S.insert(s);
S.insert(p);
std::cout << S.size();

正如你所看到的,我在set中放入了相同的元素,但这输出2。
如何使set的插入使用底层字符串的比较标准?如果它不是字符串而是更复杂的对象呢?

std::set的第二个模板参数是要使用的比较器的类型(默认为std::less<Key>):

#include <iostream>
#include <memory>
#include <set>
#include <string>
struct deref_less {
bool operator()(const auto& a, const auto& b) const { return (*a) < (*b); }
using is_transparent = void;
};
int main() {
std::shared_ptr<std::string> s(new std::string("abc"));
std::shared_ptr<std::string> p(new std::string("abc"));
std::set<std::shared_ptr<std::string>, deref_less> S;
S.insert(s);
S.insert(p);
std::cout << S.size();
}

输出:

1

auto参数是为了方便使用c++ 20,之前比较器有点冗长。using is_transparent = void;使set::find过载,例如接受std::unique_ptr<std::string>(参见godbolt的例子)。

相关内容

  • 没有找到相关文章

最新更新