如何基于第二个字符串对字符串向量的向量进行排序

时间:2014-07-28 02:34:05

标签: c++ sorting vector

我有一个字符串向量的向量。这些向量中的第二个字符串是我想要排序的。有没有办法使用std :: sort?

来做到这一点

据我所知,我应该在一个struct / class中传递一个函数,但我不确定它应该是什么样的。

2 个答案:

答案 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::sortstd::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;
}