C++ STL:使用派生虚拟类作为 std::sort() 的"Strict Weak Ordering"
C++ STL: Using derived virtual class as "Strict Weak Ordering" for std::sort()
我在使用std::sort()时遇到了瓶颈。我有一个纯虚拟类(命名为Compare
),方法的调用者派生自(命名为MyComp
)。我使用纯虚拟类作为我的API原型:
void Object::DoSort(Compare &comp) {
std::sort(this->mKeys.begin(),this->mKeys.end(), comp);
}
调用者:
class MyComp: public Compare {
bool operator()(const Row *r1, const Row *r2) { ... }
} cmp;
...
obj->DoSort(cmp);
Linux上的c++编译器报错:"不能分配'Compare'类型的对象,因为'Compare'类型有抽象的虚函数"
即使我将Compare
修改为简单的虚拟(而不是纯),std::sort()
仍然调用Compare::operator()
代码而不是MyComp::operator()
。
调用cmp(r1,r2)编译良好并返回正确的结果。
我一定是做错了什么,否则我不明白。请帮助!
std::sort
(和其他STL函数)按值接受比较器对象,因此您的对象正在被复制,但派生部分(包括其vtbl)正在被"切掉"。
你可以用代理包装你的对象:
class Proxy
{
private:
Compare &cmp;
public:
Proxy(Compare &cmp) : cmp(cmp) {}
bool operator()(const Row *r1, const Row *r2) { return cmp(r1, r2); }
};
...
MyCompare cmp = MyCompare();
std::sort(x.begin(), x.end(), Proxy(cmp));
相关文章:
- 为什么 std::unique 不调用 std::sort?
- 对字符串进行排序时,在c++中处理sort()
- std::sort()函数无法对向量的一部分进行排序
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- C++中"std::sort"比较器的不同类型
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- 按字母顺序对字符串中的字母进行排序,而无需使用内置的 sort()
- c++无值sort()的问题是什么?
- 将用户定义的类型与 std::vector 和 std::sort 一起使用
- 使用 std::sort 对向量进行稳定排序
- 如何使用 QSortFilterProxyModel::sort 对 Qlist 中的数据进行排序
- std::sort 如何处理重复的数字?
- 为什么 std::sort 找不到合适的(静态成员)函数重载?
- C++ <algorithm> 使用对象作为比较定义的 sort()
- 尝试使用谓词函数会导致错误:"std::sort"未找到匹配的重载函数
- unqualified sort() -- 为什么它在 std::vector 上使用而不是在 std::array 上
- 使用 std::sort 对二维 c 数组进行排序
- std::stable_sort vs std::sort
- std::sort 导致运算符分段错误<
- C++ STL:使用派生虚拟类作为 std::sort() 的"Strict Weak Ordering"