制作一组指针以使用底层注入的比较标准,C++
Make set of pointers to use comparison criteria of underlying injects, C++
我希望 std::set
if 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;
启用例如接受 std::unique_ptr<std::string>
的 set::find
重载(参见 godbolt 示例)。
我希望 std::set
if 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;
启用例如接受 std::unique_ptr<std::string>
的 set::find
重载(参见 godbolt 示例)。