STL iterators: container.end()
STL iterators: container.end()
我正在阅读一些关于STL的文档,其中写道end()
函数返回容器最后一个元素旁边字节的迭代器。
我想知道,如果容器占据了整个可用内存的最后一个字节,该怎么办。届时会发生什么?
C++内存模型保证您始终可以在数组的最后一个元素之后形成指向该元素的指针。如果没有,要么系统不允许您在这个位置分配对象,要么它会循环使用。此外,请注意,这对数组来说是一个潜在的问题,因为其他容器可以使用迭代器类型,这些迭代器以其他合适的形式处理过终点位置:它们完全控制增量操作的工作方式。
结束迭代器(至少是象征性的)只指向容器的结束。容器中的有效项目从*container.begin()
到*container.end()-1
。
换句话说,您可以将其他迭代器与末端迭代器进行比较,以查看它们是否相等(这告诉您已经到达容器中项的末端),但您可以而不是取消引用该末端迭代机(即,您不得试图访问它引用的项)。
编辑:对不起,有点误解了这个问题:好吧,如果容器真的使用了内存的最后一个字节(罕见/不太可能,但理论上可能),你通常会看到地址换行到内存的开头,当然,假设它是一个真正在地址方面起作用的迭代器。在这种情况下,您通常会看到它变成0
地址,它仍然可以与任何有效地址区分开来(即,0
将转换为空指针,而空指针不能是有效指针)。
然而,在一个典型的案例中,这样的事情很可能是不允许发生的。例如,在大多数32位系统上,用户被限制使用前2或3 GB的地址空间,并且较高的地址为操作系统保留。
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 反转依赖于 end() 的迭代器
- std::multimap<std::chrono::milliseconds, T>::rbegin 在 MSVS-13 中指向 end()?
- 在C++中使用 Catch 测试框架编译错误"error: expected ';' at end of declaration list"
- remove(str.begin(), str.end(), );无法正常工作(我正在使用视觉工作室 2012)
- std::p mr::memory_resource 如何与 std::container 产生性能差异?
- 在 ifcondition al中 find() C++ STL 中的 == a.end() 有什么用?
- 野牛/yacc 解析器在不被空格分隔时跳过 grammer - "unexpected $end"
- "错误 C0000:语法错误,令牌"<EOF>"处出现意外$end,并且不确定
- 了解向量中的 .begin 和 .end
- 如何实现链表的 end()?
- 使用 map.end() 访问 map 的最后一个元素
- C++ const char with .begin() and .end()
- C++ "oldstyle container ":指针/数组/新 - 可能误会?
- 在其他容器中使用 boost::container::static_vector 时,GCC 编译错误"将'const s'绑定到类型's&'的引用丢弃限定符"
- 接收"Error compiling: 0:1(1): error: syntax error, unexpected $end" C++、GLSL、着色器文件
- STL iterators: container.end()
- 在c++中从container.end()中进行减法是否安全?
- 我可以一直使用std::inserter(container,container.end())而不是std::back_