如何使指针在 std::set 中有效?
How can make pointer valid in std::set?
我有一个自定义结构,我重载了运算符 >:
struct A {
A(int a) : a_(a) {}
int a_;
friend operator > (const A& a) const {
return a_ > a.a_;
}
};
所以我可以将此结构推送到 stl 容器集中:
std::set<A> s;
s.insert(A(3));
s.insert(A(5));
s.insert(A(4));
但我正在做一个大任务,这意味着,复制操作对我来说是昂贵的。
所以,我想用这样的指针元素类型构建一个集合:
std::set<A*>s;
A a(3); A b(5); A c(4);
s.insert(&a); s.insert(&b); s.insert(&c);
但是我发现保序失败,请问有什么方法可以通过元素指针保序吗?
或者,如何将元素保存在有序容器中,无需复制并具有良好的性能?
使用自定义比较器:
#include <iostream>
#include <set>
struct CustomCmp {
bool operator()(const int* lhs, const int* rhs) const {
return *lhs < *rhs;
}
};
int main()
{
int arr[] = { 3, 1, 4 };
std::set<int*, CustomCmp> mySet;
mySet.insert(&arr[0]);
mySet.insert(&arr[1]);
mySet.insert(&arr[2]);
for (auto& el: mySet) std::cout << *el << ' '; // 1, 3, 4
return 0;
}
我有一个自定义结构,我重载了运算符 >:
struct A {
A(int a) : a_(a) {}
int a_;
friend operator > (const A& a) const {
return a_ > a.a_;
}
};
所以我可以将此结构推送到 stl 容器集中:
std::set<A> s;
s.insert(A(3));
s.insert(A(5));
s.insert(A(4));
但我正在做一个大任务,这意味着,复制操作对我来说是昂贵的。
所以,我想用这样的指针元素类型构建一个集合:
std::set<A*>s;
A a(3); A b(5); A c(4);
s.insert(&a); s.insert(&b); s.insert(&c);
但是我发现保序失败,请问有什么方法可以通过元素指针保序吗?
或者,如何将元素保存在有序容器中,无需复制并具有良好的性能?
使用自定义比较器:
#include <iostream>
#include <set>
struct CustomCmp {
bool operator()(const int* lhs, const int* rhs) const {
return *lhs < *rhs;
}
};
int main()
{
int arr[] = { 3, 1, 4 };
std::set<int*, CustomCmp> mySet;
mySet.insert(&arr[0]);
mySet.insert(&arr[1]);
mySet.insert(&arr[2]);
for (auto& el: mySet) std::cout << *el << ' '; // 1, 3, 4
return 0;
}