代码之家  ›  专栏  ›  技术社区  ›  Rafael Almeida Andre Goncalves

std::list::使用自定义比较器排序时出错(标记之前应为主表达式)。

  •  1
  • Rafael Almeida Andre Goncalves  · 技术社区  · 16 年前

    标题是主要问题。具体场景(我是“使用命名空间std;”):

    void SubstringMiner::sortByOccurrence(list<Substring *> & substring_list) {
       list::sort(substring_list.begin(), substring_list.end(), Substring::OccurrenceComparator);
    }
    

    这是比较器的定义:

    class Substring {
        // ...
        class OccurrenceComparator {
            public:
                bool operator() (Substring * a, Substring *b);
        }
    };
    

    比较器的实现是直观而简单的。我还在std::set中使用一个非常类似的比较器,它工作得很好。当我添加sortByoccurrence()函数时,它在标题中给出了错误。

    我该怎么办?

    编辑: 我现在正尝试将substring::occurrenceComparator()作为比较器传递,并得到以下错误:

    g++ -Wall -g -c substring_miner.cpp -o obj/subtring_miner.o
    substring_miner.cpp: In function ‘void SubstringMiner::sortByOccurrence(std::list<Substring*, std::allocator<Substring*> >&)’:
    substring_miner.cpp:113: error: no matching function for call to ‘std::list<Substring*, std::allocator<Substring*> >::sort(std::_List_iterator<Substring*>, std::_List_iterator<Substring*>, Substring::OccurrenceComparator)’
    /usr/include/c++/4.3/bits/list.tcc:303: note: candidates are: void std::list<_Tp, _Alloc>::sort() [with _Tp = Substring*, _Alloc = std::allocator<Substring*>]
    make: *** [substring_miner] Error 1
    

    我的代码行是:

    list<Substring *>::sort(substring_list.begin(), substring_list.end(), Substring::OccurrenceComparator());
    

    我不能删除模板,否则它会告诉我模板参数错误。

    3 回复  |  直到 16 年前
        1
  •  4
  •   CB Bailey    16 年前

    list 成员 sort 是非静态函数,因此必须在列表实例上调用。

    substring_list.sort( Substring::OccurrenceComparator() );
    

    编辑: 你不能使用自由函数 std::sort 因为它需要随机访问迭代器, 列表 迭代器不是。

        2
  •  4
  •   Pavel Minaev    16 年前

    你通过了 作为函数的参数。你不能这样做-你必须创建一个类的实例,并传递它:

    substring_list.sort(Substring::OccurrenceComparator());
    

    注意后面的括号 OccurenceComparator 上面使用默认构造函数创建类的临时对象。

    另一个错误是你打电话来 list::sort 作为类上的静态函数 std::list . 它不是静态的,因此需要将其作为上的成员函数调用 substring_list .

        3
  •  3
  •   Loki Astari    16 年前

    原来的问题已经由帕维尔·米纳耶夫解决了。
    但是一些额外的笔记。

    operator()可能是const(以及参数)。
    对于这样的简单类,只需构造它们就更容易了。

    struct OccurrenceComparator
    {
        bool operator() (Substring const* a, Substring const* b)  const;
    };
    

    注意,比较必须提供严格的弱顺序:

    模板<类BinaryPredicate>
    void sort(二进制谓词comp);

    comp必须是一个比较函数,它会导致严格的弱顺序(如lessthan comparable requirements on objects of type T中的定义)。此函数根据comp对列表*进行排序。排序是稳定的,即保留等价元素的相对顺序。所有迭代器都保持有效并继续指向相同的元素。[6]比较的数量大约为n log n,其中n是列表的大小。