Maison >développement back-end >C++ >Comment puis-je trier un vecteur en C tout en préservant les indices d'origine ?

Comment puis-je trier un vecteur en C tout en préservant les indices d'origine ?

DDD
DDDoriginal
2024-12-25 02:50:13317parcourir

How Can I Sort a Vector in C   While Preserving Original Indices?

Tri avec préservation d'index en C

Dans le domaine de la manipulation des données, le tri est une opération fondamentale qui organise les éléments dans l'ordre souhaité. Bien que les algorithmes de tri préservent intrinsèquement l'ordre des éléments égaux, il peut être souhaitable de suivre les index d'origine des éléments triés pour conserver leur contexte d'origine.

Une approche de ce problème consiste à utiliser les fonctions lambda en C 11. Un lambda est une fonction anonyme qui peut capturer des variables de sa portée environnante. Cela permet des opérations de tri concises et flexibles qui peuvent accéder à des données externes.

Voici une fonction sort_indexes personnalisée qui combine les lambdas avec l'algorithme stable_sort de la bibliothèque standard :

#include <vector>
#include <algorithm>

using namespace std;

template <typename T>
vector<size_t> sort_indexes(const vector<T> &v) {

  // Initialize original indexes
  vector<size_t> idx(v.size());
  iota(idx.begin(), idx.end(), 0);

  // Sort indexes based on values in v
  stable_sort(idx.begin(), idx.end(),
               [&](size_t i1, size_t i2) { return v[i1] < v[i2]; });

  return idx;
}

Dans cette fonction, nous d'abord initialisons un vecteur idx avec les index d'origine du vecteur d'entrée v. Ensuite, nous utilisons stable_sort pour trier les index en fonction d'un lambda comparateur qui compare les valeurs dans v. L'utilisation de stable_sort garantit que les éléments avec des valeurs égales conservent leur ordre d'origine dans le résultat trié.

Pour utiliser cette fonction, transmettez simplement le vecteur d'éléments comme argument et il sera renvoie un vecteur d'index triés. Par exemple, étant donné un vecteur [5, 2, 1, 4, 3], l'idx du vecteur renvoyé serait [1, 2, 4, 3, 0].

Cette technique vous permet de trier les éléments tout en préservant leurs index d'origine, offrant une flexibilité dans les tâches ultérieures de traitement des données.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn