"size_t"是否始终是"vector<int>::size_type"或任何其他容器类型的别名?
Is `size_t` always an alias for `vector<int>::size_type` or any other container type?
让我们做一个最简单的例子:
公式1:
std::vector<int> vec;
// add 10E11 elements
for(std::size_t n = 0; n < vec.size(); ++n)
// ...
公式2:
std::vector<int> vec;
// add 10E11 elements
for(std::vector<int>::size_type n = 0; n < vec.size(); ++n)
// ...
当然,unsigned int
或任何不适当的数据类型在这里不起作用,我们必须编译 x64。我的问题是:在这种情况下,第一个公式是否会导致问题,或者我们是否可以安全地始终以这种更短的符号编写它?如果它们很容易涵盖(x86,任何其他容器,size_type
的其他应用程序),我也会对类似的设置感兴趣。
>std::vector
保证指针是其整个序列的有效迭代器,因为vector::data
返回"一个指针,使得[data(), data() + size())
是一个有效的范围"。这是指针加法,它是在std::ptrdiff_t
上定义的,这是std::size_t
的有符号版本。
此外,[iterator.requirements.general]/6 也适用:
。对于整数值
n
和可取消引用迭代器值a
和(a + n)
,*(a + n)
等价于*(addressof(*a) + n)
...
vector::size_type
可能比std::size_t
窄,例如在64位系统上为32位。但这不是我会担心的事情。
尽管在所有常见的实现中都是这种情况,但该标准对此没有保证。可以保证的是,std::vector<T>::size_type
是定义的无符号整数类型的实现。
引用:
23.2.1 一般容器要求 [容器.要求.一般]
X::size_type [是] 无符号 整数类型
和 23.3.6.1 类模板向量概述 [向量概述] §2
typedef implementation-defined size_type; // see 23.2
虽然std::vector::size_type
通常是std::size_t
,但不能保证它必须。使用更安全
for(std::vector<int>::size_type n = 0; n < vec.size(); ++n)
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 大于65535的C++数组[size]引发不一致的溢出
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 在其他文件中创建类时在 c++ 项目中不起作用
- 为什么(-1)%vector::size()总是返回0
- 类与私有变量的其他类之间的线程安全性
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- GlobalAlloc而不是其他分配方法
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 结构和双指针隐藏在其他结构中,多层混淆
- UE4在OnComponentBeginOverlap上铸造其他actor
- 为什么 size() 在与其他堆栈交换元素后提供错误的堆栈大小?
- 为什么 const 不适用于 stl map 的 size(),而它非常适合其他容器