向量的正确用法<int>::size_type
Correct usage of vector<int>::size_type
我在一些关于C++的非常有名的书中看到——
vector<int> ivec;
for (vector<int>::size_type i = 0; i != 10; ++i) {
ivec.push_back(i);
ivec.push_back(i); // duplicate copies of each number
}
我想知道为什么在这里使用vector<int>::size_type
。他们不是 将i
与矢量的大小进行比较。目的是int
在 矢量,所以int i = 0
是正确的做法,不是吗?
vector<int>::size_type
typedef
std::size_t
反过来又会unsinged int
,但在这里我们将int
存储在vector
中。
请澄清我对vector<int>::size_type
的理解。在上面的 for 循环中使用它公平吗?
基本上,上面的代码是"好的",因为它编译并完成了预期的工作,正如其他人所说。
当他们说目的是在向量中插入十个int
s时,由于循环的格式化方式,int
s保证为正,因此unsigned int
将转换为int
。
但是,我不认为这是您所说的好做法 - 大小类型与要插入的元素的类型无关 - 大小类型基本上总是一个unsigned int
.仅使用int
或value_type
显然会使代码的意图更加清晰。
我会说不,这段代码不正确,许多编译器会警告从size_t
到int
的隐式强制转换。
vector::size_type
/size_t
应始终用于矢量索引,但如果vector
为int
,则应在其中插入int
s。
正确的代码是:
vector<int> ivec;
for (vector<int>::value_type i = 0; i != 10; ++i) {
ivec.push_back(i);
ivec.push_back(i); // duplicate copies of each number
}
for (vector<int>::size_type i = 0; i < ivec.size(); ++i) {
std::cout << ivec[i] << "n";
}
为了避免隐式强制转换和编译器警告,您可以明确说明push_back
的内容:
vector<int> ivec;
for (vector<int>::size_type i = 0; i != 10; ++i) {
ivec.push_back(static_cast<int>(i));
ivec.push_back(static_cast<int>(i));
}
在此代码中使用size_type
和static_cast
似乎是人为的。在以下示例(@AlanBirtles示例的组合(中,它会更有意义:
vector<int> ivec(20);
for (vector<int>::size_type i = 0; i != 10; ++i) {
ivec[2 * i] = ivec[2 * i + 1] = static_cast<int>(i);
}
一般
是的,您的值类型为int
。
但这不是size_type
所说的。size_type
是向量的索引类型。它是矢量大小的类型(因此得名!
我们为此使用类型别名(由标准库提供(,因为它可能/将因系统而异。它通常是一个size_t
,它本身是一些大的无符号类型的标准别名,尽管对于可移植程序,您通常无法预测哪一个。
但。。。!
这个特殊的例子令人困惑,因为书籍作者实际上是使用大小类型填充向量值。这不一定是"错误的":在 0-9 的范围内,它不会中断。编译器将仅以通常的方式隐式转换整数。
但它表达意图不正确。
我想它曾经看起来像这样:
vector<int> v(5);
for (vector<int>::size_type i = 0; i < v.size(); i++)
v[i] = 42;
然后有人更改了循环体(使得现在i
用于值,而不是索引(,并且没有考虑更改循环前导码。
使i
成为int
将更加清晰和明显。
总的来说,我会考虑避免这些"知名书籍",或者至少检查它们的勘误表,看看代码在出版后是否进行了调整,因为这是一个非常奇怪的C++例子。
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 大于65535的C++数组[size]引发不一致的溢出
- 为什么(-1)%vector::size()总是返回0
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- EASTL矢量<向量<int>>连续的
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 在函数中使用 const int size 参数创建数组会在 Visual Studio 中抛出错误 C++:表达式的计
- vector.size() 在比较中意外工作
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- 返回 str vs. str.substr(0,str.size()) 在 leetcode 中给了我不同的输出
- 为什么 GCC 不能假设 std::vector::size 在这个循环中不会改变?
- 为什么"(!v.empty())"比"(v.size() >0)"好?
- 迭代器库中的 std::size() 不适用于传递给函数的 C 样式数组
- std::string.size() 未知行为
- 为什么gmp会在这里与"invalid next size"重新定位一起崩溃?
- 为什么我会"Invalid read of size 8"?(瓦尔格林德)
- 从 std::string 到 std::array<char,size> 的 memcopy 额外数据是否是一种未定义的行为?
- 使用 std::size 来自非 const 上下文
- "fast"或"normal"在"free(): invalid next size (fast)"中是什么意思?