按字母顺序对vector<Struct>进行排序

5

我有一个std::vector<Word> data,它是以下结构体的一部分:

struct Word
{
    std::string word;
    int line_number;
};

我已经从文件中读取了单词,并将其推入存储单词和出现行号的字符串的向量中。现在我需要按字母顺序对单词进行排序,我尝试以下操作:

    std::sort(data.begin(), data.end());

然而,当我尝试编译以下内容时,出现了一长串错误。我认为这是由于排序算法试图将vector.begin()与vector.end()进行比较,但它不知道如何将结构体单词与另一个结构体单词进行评估。
然而,我也不知道。我被卡在如何比较存储在向量中的结构体中的字符串上了。
4个回答

20
在这种情况下,您应编写一个比较两个 Word 结构的函数,并将该函数传递给 std::sort
bool compare_by_word(const Word& lhs, const Word& rhs) {
    return lhs.word < rhs.word;
}

std::sort(data.begin(), data.end(), compare_by_word);

这个问题中,您可以找到一种解决方案,如果您想编写一个通用比较器来基于属性比较对象。

更新 由于我们已经有了C++11和C++14一段时间,我正在添加使用lambda的解决方案,因为这可能现在是更好的做法:

std::sort(data.begin(), data.end(), [](const Word& lhs, const Word& rhs) {
    return lhs.word < rhs.word;
});

5
你应该在你的struct Word中实现operator<

3
只有当你进行比较的方式是该类型对象的标准比较方式时,才应该这样做。如果这是一个特殊情况,则应首选自由函数或函数对象。 - Björn Pollex
@BjörnPollex:我同意,对我来说似乎是这种情况。 - amit

1

不必事后对向量进行排序,您也可以使用一个容器,该容器以排序方式存储其项目。

#include <string>
#include <set>
#include <map>

struct Word
{
    std::string word;
    int line_number;
};

struct compare_by_word
{
    bool operator()(const Word& lhs, const Word& rhs)
    {
        return lhs.word < rhs.word;
    }
};

std::set<Word, compare_by_word> foo;

std::map<std::string, int> bar;

0
如果你的编译器支持lambda表达式,你可以将其作为比较函数添加进去。
std::sort(data.begin(), data.end(),
[](const Word & lhs, const Word & rhs)
{
    return lhs.word < rhs.word;
});

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