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

C++ 如何从std::list.begin()强制使用非常量迭代器?,c++,C++,我正在使用列表作为其底层数据容器来实现一个multiset amd am。我有一个函数count,它返回私有列表中某个项的出现次数。以下是相关代码: #include <list> using namespace std; template <typename T> class miniMultiSet { public: typedef typename list<T>::iterator iterator; // miniMultiSe

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

#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
内部的
for
行上,这使我认为
迭代器it=l.begin()
在尝试从常量转换为非常量时出现了问题

这就是正在发生的事情吗

有什么方法可以调整循环或强制非常量返回
l.begin()

谢谢

“这就是正在发生的事情吗?”

那么,您给出的签名只适用于
const
类实例兼容性

 int count (const T& item) const {
                        // ^^^^^ 
“有没有办法调整该循环或强制非常量返回
l.begin()
?”

特别是对于
或强制执行非常量返回
,不,您不能,而且您肯定不希望执行此操作。您只需在循环中使用
常量迭代器即可:

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

为什么不使用
常量迭代器呢?
?您的“count()const”与常量实例兼容。因此,使用const_迭代器返回对常量值(const T&)的引用,并防止修改引用值。它强制执行const-correction。确实如此,但是如果我仍然可以通过循环增加它,那么它的常量是什么呢?@Evan
const\u迭代器
s可以像任何其他迭代器一样增加,当你要去引用它们时,差异就来了。
const
版本不允许修改迭代器指向的值。由于您不想在函数中执行这样的(修改)操作,
常量迭代器
在这里就足够了。
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;
}