如何解决使用Lambdas对C ++中的指针数组进行排序
我正在尝试编写排序模板函数以使其与自定义类一起使用。
我的代码是:
#include <iostream>
#include <vector>
struct test
{
int value;
test(int a) : value(a){};
void print() { printf("the value is : %d",value); };
};
template <class T>
void bubblesort(T *m_data,size_t size,bool (*cmp)(const T &l,const T &r))
{
for (uint32_t i = 0; i < size; i++)
for (uint32_t j = 1; j < size - i; j++)
if (cmp(m_data[j - 1],m_data[j]))
{
T temp = m_data[j];
m_data[j] = m_data[j - 1];
m_data[j - 1] = temp;
}
}
int main()
{
std::vector<test> arr;
for (size_t i = 0; i < 10; i++)
arr.emplace_back(i);
std::vector<test *> arr1;
for (auto &i : arr)
arr1.emplace_back(&i);
bubblesort<test>(&arr[0],arr.size(),[](const test &l,const test &r) { return l.value < r.value; });
// bubblesort<test*>(&arr1[0],arr1.size(),[](const test *&l,const test *&r) { return l->value < r->value; });
for (auto i : arr)
printf("%d\n",i.value);
}
我的问题是如何使用上面的sort
函数bubblesort
arr1?我必须在代码中进行哪种修改才能做到这一点?
取消注释Bubblesort线会出错
error: invalid user-defined conversion from 'main()::<lambda(const test*&,const test*&)>' to 'bool (*)(test* const&,test* const&)' [-fpermissive]
[build] 48 | bubblesort<test *>(&arr1[0],const test *&r) { return l->value < r->value; });
解决方法
您的函数类型错误; T
是test*
,因此您需要test* const&
-“引用指向test
的const指针”-如错误消息所述。
(const test*&
是“对指向常量test
的指针的引用。)
您的解决方案无法使用模板...无法推导参数类型。
考虑如下修改您的代码:
struct test
{
int value;
explicit test(int a) : value(a) {};
void print() { printf("the value is : %d",value); };
};
template <class T,class _cmp>
void bubblesort(T *m_data,size_t size,_cmp cmp)
{
for (uint32_t i = 0; i < size; i++)
for (uint32_t j = 1; j < size - i; j++)
if (cmp(m_data[j - 1],m_data[j]))
{
T temp = m_data[j];
m_data[j] = m_data[j - 1];
m_data[j - 1] = temp;
}
}
int main()
{
std::vector<test> arr;
for (int i = 0; i < 10; i++)
arr.emplace_back(i);
std::vector<test *> arr1;
for (auto i : arr)
arr1.emplace_back(&i);
bubblesort<test>(&arr[0],arr.size(),[](const test &l,const test &r) -> bool { return l.value < r.value; });
bubblesort<test*>(&arr1[0],arr1.size(),[](const test* l,const test* r) -> bool { return l->value < r->value; });
for (auto i : arr)
printf("%d\n",i.value);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。