按字母顺序对矢量<struct>进行排序</struct>

时间:2011-10-18 07:10:37

标签: c++ string algorithm sorting vector

我的std::vector<Word> data不在下面的结构中:

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

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

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

然而,当我尝试编译以下内容时,我会得到一个疯狂的错误列表。我相信这是由于sort算法试图将vector.begin()与vector.end()进行比较,但它不知道如何将struct word计算为另一个struct word。

然而,我也不知道如何比较包含在矢量中的结构的字符串。

4 个答案:

答案 0 :(得分:21)

在这种情况下,您应该编写一个比较两个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);

this question中,如果要编写基于属性比较对象的通用比较器,可以找到解决方案。

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

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

答案 1 :(得分:5)

您应该operator<

实施struct Word

答案 2 :(得分:2)

您可以使用以排序方式存储其项目的容器,而不是之后对矢量进行排序。

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

答案 3 :(得分:0)

如果您的编译器支持lamda表达式,您只需添加一个作为比较函数。

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