我正在使用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
我收到以下错误(该调用来自T
为string
的实例):
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()
由于
答案 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;
}