C++ 如何从std::list.begin()强制使用非常量迭代器?
我正在使用列表作为其底层数据容器来实现一个multiset amd am。我有一个函数count,它返回私有列表中某个项的出现次数。以下是相关代码: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
#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。确实如此,但是如果我仍然可以通过循环增加它,那么它的常量是什么呢?@Evanconst\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;
}