如何在动态内存中排序对象列表,在c++中使用泛型向量

How to order a list of objects in dynamic memory, using a generic vector in C++?

本文关键字:c++ 泛型 向量 对象 动态 内存 排序 列表      更新时间:2023-10-16

我有一个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();
  }

如何正确传递compareArticuloslista.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,因此一种解决方案是简单地将其改为staticstatic成员函数可以转换为函数指针。这样,你可以这样做:

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));