如何根据数组对应向量的值对数组进行排序?

时间:2018-07-25 17:51:23

标签: c++ algorithm sorting stdvector

我想根据相应向量的值对row数组进行排序。那就是说,我有一个向量,其中包含相同长度的整数向量。 std::vector<std::vector<int>> vec。 根据{{​​1}}的值,我想对数组vect进行排序。 row包含row个元素,其中第一个元素给出了应该为我们的行考虑的数字。如果N,那么我们应该只关心row[0]==2之后的2个元素。

  

示例:

row[0]

请注意,在Input: vect = {{0,2,3},{2,1,5},{1,2,4}} row = {3,0,1,2,-1,-2,15} 中,我们只关心第2到第4个元素,因为它的第一个元素为3(代表row的大小,即vect)。

我想根据值row[0] = vect.size()对数组和向量进行排序。也就是说,在对向量进行排序之后,应根据其元素的新位置对数组进行排序,并考虑其第一个元素。 (只需将所需的排序。)

所以我想要得到的是:

023, 215 and 124

非常感谢您的帮助。以下是代码:

Output: vect = {{0,2,3},{1,2,4},{2,1,5}}
        row  = {3,0,2,1,-1,-2,15}

1 个答案:

答案 0 :(得分:2)

关注将为您解决问题,或者至少放弃(可能没有效率)。希望这些评论可以引导您完成。

See Output

#include <vector>
#include <iostream>
#include <string>
#include <algorithm>

int main()
{
   std::vector<std::vector<int>>  vect = {{0,2,3},{2,1,5},{1,2,4}};
   std::vector<int> row = {3,0,1,2,-1,-2,15};
   // new vector:  pair of integer -> representing the rows of vect and index
   std::vector<std::pair<std::string, int>> newVect;
   newVect.reserve(vect.size());

   int index = 0;
   for(const std::vector<int>& each_row: vect)
   {
      std::string str;             // each row of vect to a single integer string
      for(const int Integer: each_row) str += std::to_string(Integer);
      newVect.emplace_back(std::make_pair(str, index));
      ++index;
   }
   // sort the new vector, according to the whole 2D vector row(which is a single string)
   std::sort(newVect.begin(), newVect.end(), [](const auto& lhs, const auto& rhs)
   {
      return lhs.first < rhs.first;
   });
   // now you can actually store the sorted vect
   vect.clear();
   for(auto index = 1; index <= row[0]; ++index)
   {
      row[index] = newVect[index-1].second;  // replace the row indexes which are sorted
      std::vector<int> vect_row;
      // change each chars of string back to corresponding row elements
      for(const char Integer: newVect[index-1].first)
         vect_row.emplace_back(static_cast<int>(Integer - '0'));
      // store to original vector
      vect.emplace_back(vect_row);
   }

   // to print
   for(const std::vector<int>& each_row: vect)
   {
      for(const int Intger: each_row)
         std::cout << Intger << " ";
      std::cout << std::endl;
   }
   for(const int it: row) std::cout << it << " ";
   return 0;
}