【问题标题】:how to compare all elements in list using unique() c++如何使用unique()c ++比较列表中的所有元素
【发布时间】:2020-08-14 01:20:50
【问题描述】:

我需要删除所有相同的单词(如果单词以相同的字母开头,则它们是相同的) 接下来是我的比较功能:

H  J
J  H
H  I

因此,我需要将每个字母与另一个字母进行比较

 bool compare(string a, string b) {
        cout << a.front() << "  " << b.front() << endl;
        return(a.front() == b.front());
    }
    void Fifth_task(list <string>& lst) {
        list <string> ::iterator it;
        lst.unique(compare);
        for (it = lst.begin(); it != lst.end(); ++it) {
            cout << *it << endl;
        }
    }


    int main(){
    list <string> first;
    first.push_back("Hello");
    first.push_back("Johnny");
    first.push_back("Hello");
    first.push_back("Ildar");
    Fifth_task(first);
    return 0;
    }

最后我应该得到三个字:你好,约翰尼,伊尔达 我该怎么做?

【问题讨论】:

  • std::list::unique 返回连续个重复元素。因此,您要么需要在调用 unique 之前对列表进行排序,要么在必须保持顺序时使用不同的方法。
  • @1201ProgramAlarm 我需要同样的订单

标签: c++ string list compare unique


【解决方案1】:

来自cppreference,独一无二的意志...

从范围内每个连续组的等效元素中删除除第一个元素之外的所有元素

(强调我的)

在该页面上的示例中,在{1,2,1,1,3,3,3,4,5,4} 上调用unique() 将产生{1 2 1 3 4 5 4 x x x}。注意重复的 1 和 4 是如何没有被删除的。这是因为他们不在一个“连续的组”中。

因此,为了确保以相同字母开头的单词都在“连续组”中,请先对列表进行排序:

 void Fifth_task(list <string>& lst) {
    lst.sort();
    lst.unique(compare);
    // ...

在此处查看实际操作:https://ideone.com/1i48nj

【讨论】:

  • 但我需要相同的订单
【解决方案2】:

std::list::unique 删除相邻的重复项。您给它的谓词是用于比较相邻项目的相等性。这不是您想要的,因为您想将一个项目与之前的所有项目进行比较。

您可以做的是改用list::remove_if,使用一组来记录已经看到的第一个字母。所以我会把你的Fifth_task 函数改成这样:

void Fifth_task(std::list<std::string>& lst) {
    std::list<std::string>::iterator it;
    std::set<char> seen;
    lst.remove_if([&](const std::string& s) {
        char c = std::tolower(s[0]);
        bool remove = (seen.count(c) > 0);
        seen.insert(c);
        return remove; });

    for (it = lst.begin(); it != lst.end(); ++it) {
        std::cout << *it << std::endl;
    }
}

这里的工作版本:https://godbolt.org/z/WLwQeZ

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    相关资源
    最近更新 更多