[英]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
与向量的大小进行比较。 目的是在向量中插入10个int
,所以int i = 0
是正确的做法,不是吗?
vector<int>::size_type
将为std::size_t
typedef
,而后者将不再unsinged int
,但这里我们将int
存储在vector
。
请阐明我对vector<int>::size_type
理解。 在上面的for循环中使用它是否公平?
基本上,上面的代码在编译和完成预期工作的意义上是“好的”,就像其他人所说的那样。
当他们说的意图是插入10 int
在矢量s时, int
s的因为环是如何被格式化保证积极的,所以unsigned int
只会转换成int
。
但是,我不像您所说的那样是一种好习惯-size类型与要插入的元素的类型无关-size类型基本上始终是unsigned int
。 仅使用int
或value_type
显然会使代码的意图更加清晰。
我会说不,这段代码是不正确的,许多编译器会警告从size_t
到int
的隐式转换。
vector::size_type
/ size_t
应该始终用于向量索引,但是如果您有一个int
vector
,则应该在其中插入int
。
正确的代码是:
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
,它本身是一些大的无符号类型的标准别名,尽管您通常无法预测可移植程序的类型。
这个特殊的例子使人迷惑不解,因为书的作者实际上是使用size类型填充矢量值 。 这不一定是“错误的”:在0-9的范围内,它不会中断。 编译器将以通常的方式隐式转换整数。
但是它表达的意图不正确。
我想它以前看起来像这样:
vector<int> v(5);
for (vector<int>::size_type i = 0; i < v.size(); i++)
v[i] = 42;
然后有人更改了循环主体(这样, i
现在用于值,而不是用于索引),而没有考虑更改循环前导。
使i
成为一个int
将更加清晰和明显。
总的来说,我会考虑避免使用这些“知名书籍”,或者至少要检查它们的勘误表以查看发布后代码是否已进行了调整,因为那是C ++的一个很奇怪的例子。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.