我的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。
然而,我也不知道如何比较包含在矢量中的结构的字符串。
答案 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;
});