【发布时间】:2014-09-19 04:43:56
【问题描述】:
我有一个字符串向量的向量。这些向量中的第二个字符串是我想要排序的。有没有办法使用 std::sort 做到这一点?
据我所知,我应该在结构/类中传递一个函数,但我不确定它应该是什么样子。
【问题讨论】:
-
看看reference。
我有一个字符串向量的向量。这些向量中的第二个字符串是我想要排序的。有没有办法使用 std::sort 做到这一点?
据我所知,我应该在结构/类中传递一个函数,但我不确定它应该是什么样子。
【问题讨论】:
定制您的比较函数,以便比较字符串向量中的第二个元素。
#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()的第三个参数,则调用operator<进行比较,比较向量lexicographically。
【讨论】:
这可能是一个解决方案!
#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;
}
【讨论】:
sort 比qsort 更好,但有些人说相反,在这里你可以找到详细信息stackoverflow.com/questions/4708105/… .. 我已经提到了另一种方法,因为那里的人可能更喜欢这样做第二种方式:)