如何按特定的预定顺序对字符串向量进行排序?

Ros*_*nev 8 c++ sorting string algorithm vector

问题:我需要按照特定的顺序对字符串向量进行排序.假设我们有一个常量向量或具有确切顺序的数组:

vector<string> correctOrder = {"Item3", "Item1", "Item5", "Item4", "Item2"};
Run Code Online (Sandbox Code Playgroud)

接下来,我们有一个动态的传入向量,它将具有相同的项目,但它们可能是混合的而且数量较少.

vector<string> incommingVector = {"Item1", "Item5", "Item3"};
Run Code Online (Sandbox Code Playgroud)

所以我需要incomming像第一个向量一样对向量进行排序correctOrder,结果必须是:

vector<string> sortedVector = {"Item3", "Item1", "Item5"};
Run Code Online (Sandbox Code Playgroud)

我认为正确的顺序可能以不同的方式表示,但无法弄清楚.有谁可以帮助我吗?

Dav*_*aro 10

如果默认比较不够(词典比较),那么你可以做的最简单的事情就是为sort函数提供一个lambda,告诉它哪个字符串首先出现.您可以unordered_map<string,int>correctorder向量中的字符串作为键,并将其在排序数组中的相应位置作为值.

cmp功能将简单地比较您提供的键的值incommingVector.

unordered_map<string, int> my_map;
for(int i = 0 ; i < correctorder.size() ; i++)
   my_map[correctorder[i]]=i;

auto cmp =[&my_map](const string& s, const string& s1){
   return my_map[s] < my_map[s1];
}   

sort(incommingVector.begin(), incommingVector.end() , cmp);
Run Code Online (Sandbox Code Playgroud)


Kap*_*pil 3

您可以创建自己的函子来按模板向量顺序对向量进行排序,如下代码所示:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
struct MyComparator
{
    //static const int x = 9;
  const std::vector<std::string> correctOrder{"Item1", "Item2", "Item3", "Item4", "Item5"};
  bool operator() (const std::string& first,const std::string& second )
  {
      auto firstitr = std::find(correctOrder.begin(),correctOrder.end(),first);
      auto seconditr = std::find(correctOrder.begin(),correctOrder.end(),second);
      return firstitr < seconditr;
  }
};
void printVector(const std::vector<std::string>& input)
{
    for(const auto&elem:input)
    {
        std::cout<<elem<<" , ";
    }
    std::cout<<std::endl;
}
int main()
{
  std::vector<string> incomingVector = {"Item3", "Item5", "Item1"};
  std::cout<<"vector before sort... "<<std::endl;
  printVector(incomingVector);
  std::sort(incomingVector.begin(),incomingVector.end(),MyComparator());
  std::cout<<"vector after sort...."<<std::endl;
  printVector(incomingVector);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)