繁体   English   中英

正确使用向量 <int> ::尺码​​类型

[英]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 仅使用intvalue_type显然会使代码的意图更加清晰。

我会说不,这段代码是不正确的,许多编译器会警告从size_tint的隐式转换。

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_typestatic_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM