C++使用比较器对字符串向量的向量进行排序。请帮助我理解。

3
我正在尝试对一个字符串的向量进行排序,但我不知道如何创建比较函数。
我看到了这个线程,但是无法将其实现到我的情况中:sorting vector of vector of strings in C++ 所以我有一个看起来像这样的字符串的向量:
hello, world, 1, 3, 4, 7, 2, 1
world, hello, 1, 4, 8, 4 ,2, 1
phone, mouse, 2, 3, 5, 2, 1, 4
我需要按照用户指定的列对此字符串的向量进行排序。我的用户可以指定多个要排序的列。假设是第3和第5列。第3列(1,1,2)在第1行和第2行具有相同的值,然后我们必须按照第5列进行排序。为了不使事情复杂化,这全部是按升序排列的。
我不理解当您将其传递给比较器函数时它是如何工作的。我的功能如何在那些线程中发布的示例中循环?
无论如何,提前感谢!

2
请问如何对一个向量进行多次排序?(今天另一位用户也提出了同样的问题) - Alexander Tobias Bockstaller
我知道这个lhs和rhs的概念,但我不知道如何初始化lhs和rhs的vector<string>。应该怎么做?我把所有的string向量都放在了vector<vector<string>> allInputs中。 - user1375155
1个回答

4
您可以使用std::sort对向量进行排序,并定义一个自定义比较函数对象(即重载了operator()的类)。
您可以将排序列的索引存储在std::vector中(它将是自定义比较器对象的"状态"的一部分),并比较存储在该向量中索引所指定的列中的字符串。
您从"排序列"向量中指定的第一个索引处的列开始比较值;如果它们相同,则继续比较向量中下一个索引处指定的列中的值,等等。这可以在比较器的operator()重载体的for循环内部完成。
请参阅以下代码作为示例(使用g++ (GCC) 4.7.2编译):
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
using namespace std;

vector<vector<string>> BuildTestData()
{   
    vector<string> r1 = {"hello", "world", "1", "3", "4", "7", "2", "1"};
    vector<string> r2 = {"world", "hello", "1", "4", "8", "4", "2", "1"};
    vector<string> r3 = {"phone", "mouse", "2", "3", "5", "2", "1", "4"};

    return vector<vector<string>>{r1, r2, r3};
}

void PrintData(const vector<vector<string>> & v)
{
    for (size_t r = 0; r < v.size(); r++)
    {
        for (size_t c = 0; c < v[r].size(); c++)
            cout << v[r][c] << ' ';
        cout << '\n';
    }
}

class StringListComparator
{
public:
    explicit StringListComparator(vector<int> sortColumns)
        : m_sortColumns( move(sortColumns) )
    {
    }

    bool operator()(const vector<string>& lhs, const vector<string>& rhs) const
    {   
        // For each sorting column:
        for (size_t i = 0; i < m_sortColumns.size(); i++)
        {
            // Comparison with current column
            const int currentColumn = m_sortColumns[i];

            if (lhs[currentColumn] < rhs[currentColumn])
                return true;

            if (lhs[currentColumn] > rhs[currentColumn])
                return false;

            // lhs[currentColumn] == rhs[currentColumn],
            // so check with next sorting column
        }

        return false;
    }

private:
    vector<int> m_sortColumns;
};

int main()
{
    auto v = BuildTestData();
    cout << "Before sorting:\n";    
    PrintData(v);

    vector<int> sortColumns = {5, 7}; // indexes are 0-based

    sort(v.begin(), v.end(), StringListComparator(sortColumns));

    cout << "\nAfter sort:\n";
    PrintData(v);
}

样例运行:
Before sorting:
hello world 1 3 4 7 2 1
world hello 1 4 8 4 2 1
phone mouse 2 3 5 2 1 4

After sort:
phone mouse 2 3 5 2 1 4
world hello 1 4 8 4 2 1
hello world 1 3 4 7 2 1

@user1375155:成为一个好的StackOverflow社区成员:如果您发现这篇文章(以及其他人写的文章)有用,请给它们点赞并将最佳答案标记出来。 - Mr.C64

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接