【问题标题】:How to sort a vector of string vectors based on just the second string [duplicate]如何仅根据第二个字符串对字符串向量的向量进行排序[重复]
【发布时间】:2014-09-19 04:43:56
【问题描述】:

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

据我所知,我应该在结构/类中传递一个函数,但我不确定它应该是什么样子。

【问题讨论】:

标签: c++ sorting vector


【解决方案1】:

定制您的比较函数,以便比较字符串向量中的第二个元素。

#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&lt;进行比较,比较向量lexicographically

【讨论】:

  • 所以我认为 std::sort 只是“知道如何处理” lhs 和 rhs?它会自动调用那些与正在比较的对象?编辑:另外,在常规的默认 std::sort 中,它是如何做到的?是比较所有向量中的所有字符串还是什么?
  • @user3816764 已更新。
  • 谢谢。为什么使用'
  • 比较函数必须设置strict weak ordering
【解决方案2】:

这可能是一个解决方案!

#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;
}

【讨论】:

  • 其他人打败了你,但谢谢你:)
  • 没问题!欢迎:D
  • 使用 qsort 会有什么好处吗?
  • 可能是sortqsort 更好,但有些人说相反,在这里你可以找到详细信息stackoverflow.com/questions/4708105/… .. 我已经提到了另一种方法,因为那里的人可能更喜欢这样做第二种方式:)
  • 如果您阅读链接问题的最佳答案,您会发现 qsort 并没有更快
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-31
  • 2021-03-15
  • 2021-03-20
  • 1970-01-01
  • 2022-11-15
相关资源
最近更新 更多