我有一个字符串向量的向量。这些向量中的第二个字符串是我想要排序的。有没有办法使用std :: sort?
来做到这一点据我所知,我应该在一个struct / class中传递一个函数,但我不确定它应该是什么样的。
答案 0 :(得分:5)
定制比较函数,以便比较字符串向量中的第二个元素。
#include <algorithm>
#include <vector>
#include <string>
using std::vector;
using std::string;
bool cmp(const vector<string> &lhs, const vector<string> &rhs)
{
return lhs[1] < rhs[1];
}
vector<vector<string> > vecvecstr;
std::sort(vecvecstr.begin(), vecvecstr.end(), cmp);
只要需要进行排序比较, std::sort()
就会调用cmp()
。
如果省略std::sort()
的第3个参数,则会调用operator<
进行比较,比较向量lexicographically。
答案 1 :(得分:1)
这可以是一个解决方案!
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool compare(const vector<string> &V1, const vector<string> &V2) {
return V1[1] < V2[1];
}
int main(void) {
vector< vector<string> > container;
sort(container.begin(), container.end(), compare);
return 0;
}
修改强>
如果你不知道的话,我想提一个替代的方法(记住,由于内联的事实,std::sort
比std::qsort
快约670%。所以这不是'比上面更好):
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int compare(const void* a, const void* b) {
vector<string> V1 = *((vector<string>*)a);
vector<string> V2 = *((vector<string>*)b);
if (V1[1] > V2[1])
return -1;
if (V1[1] == V2[1])
return 0;
return 1;
}
int main(void) {
vector< vector<string> > container;
qsort(&container[0], container.size(), sizeof(string), compare);
return 0;
}