如何在动态内存中排序对象列表,在c++中使用泛型向量
How to order a list of objects in dynamic memory, using a generic vector in C++?
我有一个vector类模板,它有一个成员函数,该成员函数接受指向函数的指针:
template <class T>
void VecGenerico<T>::order(int fin, bool (*compare)(T,T)) //orders the vector
{
for (int i=0;i<fin;i++)
{
for (int j=i;j<fin;j++)
{
if ((*compare)(vector[i],vector[j])) //generic procedure
swap(vector[i],vector[j]);
}
}
}
我在另一个类中使用向量类,称为Tienda
(shop):
IN Tienda.h
...
private:
VecGenerico<Articulo*> lista; //Articulo is an abstract class
int indice; //index
...
IN Tienda.cpp
...
Tienda::Tienda() : lista(20)
{
indice = 0;
}
bool Tienda::compareArticulos(Articulo* aux, Articulo* aux2)
{
if (*aux > *aux2)
return true;
return false;
}
void Tienda::mostrar_articulos() //shows the list of objects after being ordered
{
lista.order(indice,*compareArticulos,?,?); // fix
for (int i=0;i<indice;i++)
lista[i]->mostrar_articulo();
}
如何正确传递compareArticulos
到lista.order()
在order
成员函数中(为了一致性,实际上应该称为sort
),您将compare
定义为函数指针:
template <class T>
void VecGenerico<T>::order(int fin, bool (*compare)(T,T))
但是,要传入的比较器是成员函数:
bool Tienda::compareArticulos(Articulo* aux, Articulo* aux2)
不能将成员函数转换为函数指针。然而,compareArticulos
中没有任何内容以任何方式引用this
,因此一种解决方案是简单地将其改为static
。static
成员函数可以转换为函数指针。这样,你可以这样做:
lista.order(indice, compareArticulos);
更一般地说,您应该选择任何类型的比较器作为参数:
template <class T>
template <class Compare>
void VecGenerico<T>::order(int fin, Compare compare);
这时,如果您确实需要成员函数比较器,您也可以这样做:
lista.order(indice, std::bind(&Tienda::compareArticulos, this));
相关文章:
- 错误处理.将系统错误代码映射到泛型
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 链表的泛型函数remove()与成员函数remove)
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- 模板化接口 - 创建一个泛型模板类以返回任何容器
- 如何编写将要继承的泛型代码?
- C++17 如何保存泛型可调用对象以供以后使用
- 使用宏扩展的泛型:为什么指令缓存使用不当?
- C++泛型类错误,问题出在哪里?
- C++泛型类,单独实现?
- 将参数传递给泛型 lambda 时复制构造函数不正确
- 泛型枚举和其他类型的重载模板函数
- 使用泛型类型推送到堆栈时出现问题
- 可变参数泛型 lambda 和函数重载
- C++ 泛型和多态性:这种模式可行吗?
- 这些语句是否等效(静态变量、常量变量和泛型)
- Java 是否像C++模板一样具有泛型推论?
- 为堆栈实现泛型集合
- 以特征类型作为参数的泛型函数回调
- 如何在容器中指定模板化别名的泛型类型