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)
您可以创建自己的函子来按模板向量顺序对向量进行排序,如下代码所示:
#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)