c++ - 在使用 vector 和迭代器时与 const 行为作斗争

标签 c++ vector iterator constants

我在使用 vector 、迭代器然后使用 const 时遇到问题.

对于一些上下文,我正在尝试为 vector<string> 创建一个写入方法这样我就可以轻松地打印出 vector 中的所有字符串。

代码如下:

void ArrayStorage::write(ostream &sout) const{
    for (vector<string>::iterator stringIt = _dataVector.begin();
                    stringIt < _dataVector.end();
                    stringIt++){
        sout << *stringIt;
    }
}

ostream& operator<<(ostream &sout, const ArrayStorage &rhs){
    rhs.write(sout);
    return sout;
}

当我尝试这样做时,我最终在第 2 行收到错误:

cannot convert from 'std::_Vector_const_iterator<_Myvec>' to 'std::_Vector_iterator<_Myvec>'.

所以我必须删除 const从 write 方法的末尾开始,然后为 operator<<工作我必须删除 const来自 rhs 参数。

这是为什么?我不想改变任何类(class)成员,所以我不明白发生了什么......我错过了什么?

最佳答案

这就像编译器告诉你的一样。使用

::const_iterator

代替

::iterator

所以

for (vector<string>::const_iterator stringIt = _dataVector.begin();
                stringIt != _dataVector.end();
                ++stringIt){
    sout << *stringIt;
}

会起作用。与 end() 比较时,请务必使用 != 而不是 <。

关于c++ - 在使用 vector 和迭代器时与 const 行为作斗争,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9453664/

相关文章:

c++ - 如何将 vector<...> 转换为 cv::Mat?

c++ - 保留 std::vector<> 的前 N ​​个元素并删除其余元素

c++ - 内部静态和捕获的可变之间的 Lambda 状态行为差异

c++ - 我可以强制标量类型由 int{} 初始化为零吗?

c++ - 在 C++ 中循环 vector<string> 的结构

c++ - 清理双向迭代器代码

c# - 为什么在 LINQ 扩展方法中对实际迭代器函数使用包装器?

android - 是否有(有点高级的)C++ 库来创建在 iOS 和 Android 上运行的 pdf 文档?

java - 为什么 java.util.Stack 是使用 Vector 而不是 Arraylist 实现的

c++ - 为自定义迭代器特化 std::copy