视觉对象无法分配列表迭代器 [C++]
visual Can't assign List Iterator [C++]
我有以下方法:
void* vpArr_t::operator[](int i) const
{
if (!isEmpty() && i >= 0 && i < nOfItems)
{
list<void*>::iterator it;
int idx;
for(it = array.begin(), idx = 0; idx < i; ++it, ++idx); // go to the i'th element
return *it;
}
else
{
return NULL;
}
}
地点:
array
是一个列表类型。
我在下一行中得到一个红色下划线(编译错误):
for(it = array.begin(), idx = 0; idx < i; ++it, ++idx);
在:it = array.begin()
它说我试图将list<void*>::const_iterator
设置为list<void*>::iterator
类型。
但是我注意到begin()
方法有一个iterator
重载。如何解决这个错误?我用的是Visual c++ 2012
假设array
是一个数据成员,而您在const
成员函数中,因此您不能在数据成员上调用非const方法。所以你需要一个const_iterator
:
list<void*>::const_iterator it,
可以推测,array
是vpArr_t
的成员。因为这个vpArr_t::operator[]
重载被声明为const
,所以vpArr_t
的成员实际上也是const
。这确保了您不会修改vpArr_t
对象的状态。由于array
实际上是const
,当你调用begin
时,你会得到一个const_iterator
。
由于实际上没有修改array
的内容,因此应该将迭代器类型更改为const_iterator
:
list<void*>::const_iterator it;
如果你想要修改array
的内容而使用一个非const
的迭代器,你需要让operator[]
成为一个非const
的函数。
尝试list<void*>::const_iterator it
代替:array
可能是const引用或类中未标记为mutable
的成员变量。您的函数被标记为const,因此不能在其中修改成员数据。
除了不能使用iterator
但必须使用const_iterator
这一事实之外,还有一个函数可以帮助您:
list<void*>::const_iterator it = arary.begin();
std::advance(it, i);
也就是说,将双链表称为数组是有问题的。而且,这并不是很有效,使用vector<>
或deque<>
会让您在恒定时间内访问第i个元素。此外,我将使用size_t
作为索引,这与c++标准库的其余部分更加一致。
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在c++迭代器类型中包装std::chrono
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 对于set上的循环-获取next元素迭代器
- 为什么output_editor Concept不需要output_e迭代器标记
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 使用迭代器时如何访问对象在向量中的位置?
- std::vector::迭代器是否可以合法地作为指针
- 跟随整数索引列表的自定义类迭代器
- 不明白迭代器,引用和指针失效,一个例子
- 我可以使用反向迭代器作为ForwardIt吗
- ESP8266单片机矢量迭代器的C++问题
- 如何在C++中将迭代器作为函数参数传递
- 是否应避免从非常量迭代器转换为常量迭代器?
- 如何在 c++ 中将字符串迭代器变量传递给函数?
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 为什么 C++ std::unordered_map 从 emplace/ 找到返回一个迭代器?