对向量进行排序按字母顺序

发布于 2024-12-10 11:57:41 字数 443 浏览 0 评论 0原文

我有一个 std::vector; data 不在下面的结构中:

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

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

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

但是,当我尝试编译以下内容时,我得到了一长串疯狂的错误。我相信这是由于排序算法尝试将向量.begin() 与向量.end() 进行比较,但它不知道如何将结构词评估为另一个结构词。

然而我也没有。我对如何比较向量中包含的字符串和结构感到困惑。

I have a std::vector<Word> data that is off of the struct below:

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

I have read in words from a file and pushed it in to my vector storing the words in the string above along with the line number that the word appears on. Now I need to sort the words alphabetically and I attempt the following:

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

However when I try to compile the following I get a crazy long list of errors. I believe this is due to the sort algorithm trying to compare the vector.begin() to vector.end() but it doesn't know how to evaluate the struct word to another struct word.

However neither do I. I am stumped on how to compare the string contained with the structs in the vector.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

眸中客 2024-12-17 11:57:41

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

In this scenario you should write a function that compares two Word structs and pass that function to 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);

In this question you can find solution if you want to write a generic comparator for comparing objects based on an attribute.

Update Since we've had C++11 and C++14 for a while now, I'm adding a solution using a lambda, because that is probably the better practice now:

std::sort(data.begin(), data.end(), [](const Word& lhs, const Word& rhs) {
    return lhs.word < rhs.word;
});
£冰雨忧蓝° 2024-12-17 11:57:41

您应该将 operator< 实现到您的 struct Word

you should implement operator< to your struct Word

墨落画卷 2024-12-17 11:57:41

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

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

Instead of sorting the vector afterward, you can also use a container which stores its items in a sorted manner.

#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;
世界等同你 2024-12-17 11:57:41

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

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

If your compiler supports lamda expressions you could just add one as the compare function.

std::sort(data.begin(), data.end(),
[](const Word & lhs, const Word & rhs)
{
    return lhs.word < rhs.word;
});
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文