2014-10-11 74 views
0

我正在使用列表作为其基础数据容器来实现multiset和amd。我有一个函数计数,它返回私人列表中项目的出现次数。下面是相关代码:如何从std :: list.begin()强制一个非常量迭代器?

#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()

感谢

+2

为什么你不使用'const_iterator'? – 2014-10-11 18:48:38

+0

你的“count()const”是const实例兼容的。 因此,使用const_iterator返回对常量值(const T&)的引用,并防止修改引用的值。它强制执行const正确性。 – fox 2014-10-11 20:22:09

回答

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

这样做,但如果我仍然可以通过循环增加它,它是不变的? – Evan 2014-10-11 19:19:48

+1

@Evan'const_iterator'可以像任何其他的一样增加,当你要去引用它们时,差异就会出现。 'const'版本不允许你修改迭代器指向的值。既然你不想在你的函数中做这样的(修改)操作,'const_iterator'就足够了。 – 2014-10-11 19:24:23