在c++中从container.end()中进行减法是否安全?
Is it safe in C++ to subtract from container.end()?
也就是说,如果container
不是空的,我可以安全地这样做:
std::vector<int> container;
container.push_back( 0xFACE8D );
auto last = container.end() - 1;
:
编辑:用--
代替-1
:
std::list<int> container;
container.insert( 0xFACE8D );
auto last = container.end();
--last;
和任意非空容器?
编辑:让我澄清一下这个问题。有时候完全合法的代码会出现错误。问题是:假设上面的代码可以编译,这样做安全吗?
对于普通的c风格数组应该是安全的,因为对应的迭代器只是指针。但是对于更复杂的容器安全吗?
假设使用如下迭代器实现list:
class MyListIterator {
MyListIterator *prev, *next;
MyListIterator * operator--() { return prev; }
...
};
class MyList {
MyListIterator *end() { return NULL; }
...
};
然后尝试减少container::end()
,尽管在语法上是完全合法的,将导致段错误。
我希望,虽然,stl
容器比这聪明得多。因此,关于上述stl::list
代码行为的保证的问题,如果有的话。
std::vector
返回随机访问迭代器,所以这对于vector
来说是安全的。
std::list
返回双向迭代器。它们可以递增(++
)和递减(--
),但不允许任意算术(+
, -
)或相对比较(>
, <
)。使用list
是不安全的。
可以在双向迭代器上使用std::advance
来前进或后退任意数量。在c++ 11中,你可以使用std::prev
来代替iter - 1
。
c++标准规定std::vector<T>::iterator
是指向过尾元素的随机访问迭代器。因此,您可以安全地使用-
和+
运算符。
与std::vector
不同,std::list<T>::iterator
是双向迭代器,只支持--
和++
运算符。
相关文章:
- 通过网络、跨平台传递std::变体是否安全
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 在函数结束后使用指向变量的指针是否安全?
- 逐字节删除 void* 是否安全?
- 在 RAII 构造中修改 RVO 值是否安全?
- 线程调用的函数对对象删除是否安全?
- 将对象的字节复制到数组并再次复制回来是否安全
- 使用枚举为数组编制索引是否安全?
- 返回从字符串文本创建的静态string_view是否安全?
- 在cstlib中将#include_next替换为#include是否安全
- 由并发无序映射查找线程调用的函数是否安全?
- 使用 c++ 原子时编写"y=++x"是否安全?
- 从另一个线程发出信号是否安全?
- 从其存储的回调中删除 std::函数是否安全
- 使用 std::vector::swap 方法在C++中交换两个不同的向量是否安全?
- 当我在C++中调用 struce 的只读静态成员时,线程是否安全
- 同时调用 ASIO 对象的 API 是否安全?
- 使用自己的迭代器分配容器是否安全?