Comment combiner deux std :: vector en un seul std :: vector avec std :: pair

Supposons que j’ai deux vecteurs “a” et “b” et que je veuille sortinger “a” et que je veuille ré-ordonner “b” exactement comme le sortingé “a”.

L’approche la plus logique à laquelle je puisse penser est de combiner ces deux vecteurs en un seul vecteur de std :: pair afin que je puisse appliquer std :: sort. Voici un exemple de jouet.

std::vector a(3,1); std::vector b(3,"hi"); std::vector<std::pair> p(3); for(int i=0;i<a.size();i++){ p.push_back(std::make_pair(std::ref(a[i]),std::ref(b[i]))); } p[0].first = p[0].first+1; std::cout << p[0].first << " " << a[0] << std::endl; 

J’attends 2 2 mais c’est l’impression 2 1. J’ai également essayé de remplacer la boucle for par

 for(int i=0;i<a.size();i++){ p[i].first = std::ref(a[i]); p[i].second = std::ref(b[i]); } 

mais je suis toujours en train d’imprimer 2 1. Je pourrais copier les valeurs de “p” dans “a” et “b” après le sorting, mais cela sera inefficace si “a” et “b” sont grands. Qu’est-ce que je fais mal?

Mon compilateur est gcc 4.9.3.

Vous voulez un vecteur de paires de références comme:

 #include  #include  #include  #include  int main() { std::vector a(3,1); std::vector b(3,"hi"); std::vector> p; for(int i=0;i(a[i],b[i])); } p[0].first = p[0].first+1; std::cout << p[0].first << " " << a[0] << std::endl; } 

Attention, toutes les opérations possibles ne peuvent pas être effectuées avec une paire de références. Par exemple, vous ne pouvez pas en créer une instance avec un constructeur sans paramètre. C'est pourquoi vous ne pouvez pas initialiser le vecteur avec trois éléments vides comme dans votre exemple:

  std::vector> p(3);