如何从std :: list.begin()强制非常量迭代器?

时间:2014-10-11 18:47:38

标签: c++

我正在使用list作为其底层数据容器来实现multiset amd am。我有一个函数计数,它返回私有列表中项目的出现次数。以下是相关代码:

#include <list>
using namespace std;

template <typename T>
class miniMultiSet
{
    public:

    typedef typename list<T>::iterator iterator; // miniMultiSet iterators are simply list iterators
    typedef typename list<T>::const_iterator const_iterator;

    miniMultiSet(){} // default constructor

    bool empty() const // is the multiset empty?
    {return l.empty();}

    int size() const // return the number of elements in the multiset
    {return l.size();}

    int count (const T& item) const
    {
        int cnt = 0;
        for (iterator it = l.begin(); it != l.end(); ++it)
        {
            if (*it == item)
                cnt++;
        }
        return cnt;
    }

    //other member functions

    private:
    list<T> l;// multiset implemented using a list  
};

编译后包括使用count我收到以下错误(该调用来自Tstring的实例):

error: conversion from 'std::list<std::basic_string<char>, std::allocator<std::basic_string<char> > >::const_iterator {aka std::_List_const_iterator<std::basic_string<char> >}' to non-scalar type 'miniMultiSet<std::basic_string<char> >::iterator {aka std::_List_iterator<std::basic_string<char> >}' requested
for内的count行上的

,这让我觉得iterator it = l.begin()导致尝试从常量转换为非常量时出现问题。

那是怎么回事?

有没有办法可以调整该循环或强制l.begin()

的非常量返回

由于

1 个答案:

答案 0 :(得分:1)

  

“那是怎么回事?”

嗯,您提供的签名仅适用于const类实例兼容性

 int count (const T& item) const {
                        // ^^^^^ 
  

“有没有办法可以调整该循环或强制l.begin()非常常返回?”

特别是对于 or force a non constant return ,不,你不能,而且你当然不希望这个操作。您只需在循环中使用const_iterator

int count (const T& item) const {
    int cnt = 0;
    for (const_iterator it = l.begin(); it != l.end(); ++it) { 
      // ^^^^^^^^^^^^^^
        if (*it == item)
            cnt++;
    }
    return cnt;
}