3 votes

C++ Trier un vecteur de <T> selon un vecteur de doubles

Je veux trier un vecteur de T en fonction d'un vecteur de double. C'est-à-dire que si j'ai

vector<T> a;
vector<double>b;

Si a es {t1, t2, t3, t4} y b es {3, 1, 5, 2} Je veux obtenir {t2, t4, t1, t3} .

Je ne sais pas comment déclarer le modèle. J'essaie quelque chose comme

template<vector<class T>> vector<T> sortByArray(vector<T> a, vector<double>b)

Et je n'ai aucune idée de la façon d'écrire le corps de la fonction non plus.

Merci.

EDIT : C'est l'utilisation de mon algorithme. Je n'y arrive pas.

template <typename T> struct dataPair
{
    dataPair(double s, T o) 
    : m_sortData(s)
    , m_otherData(o)
    {

    }

    bool operator< (const dataPair &rhs) { return (m_sortData < rhs.m_sortData); }

    double m_sortData;
    T m_otherData;

}

  template <class T> vector<T> sortByArrayStuff(vector<T> objects, vector<double> sortNumber) {
    vector<dataPair<T>> v;
    for (unsigned int i = 0; i < objects.size(); i++) {
        v.push_back(dataPair<T>(objects[i], sortNumber[i]));
    }
    sort(v.begin(), v.end());
    vector<T> retVal;

    for (unsigned int i = 0; i < objects.size(); i++) {
        retVal.push_back(dataPair<T>(objects[i], sortNumber[i]));
    }
    return retVal;
};

Je veux utiliser le même modèle pour les vecteurs de "Points" et les vecteurs de vecteurs de "Points" :

vector<double> sortedAreas;
vector<Point> sortedPoints = sortByArray<vector<Point>>(points, sortedAreas);
vector<vector<Point>> sortedContours = sortByArray<vector<vector<Point>>>(contours, sortedAreas);

L'erreur est

cannot convert parameter 1 from 'dataPair<T>' to 'cv::Point &&'
          with
          [
              _Ty=cv::Point
          ]
          and
          [
              T=cv::Point
          ]
          Reason: cannot convert from 'dataPair<T>' to 'cv::Point'
          with
          [
              T=cv::Point
          ]

0voto

Sujit Points 108

Si vous voulez trier deux vecteurs simultanément, vous devriez plutôt créer un std::vector (disons c) de std::pair. Le premier composant doit être celui qui doit être trié normalement et le second doit être celui qui doit être trié en conséquence.

std::vector<std::pair<double, T>> c;
std::sort(c.begin(), c.end());

J'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X