向量的正确用法<int>::size_type

Correct usage of vector<int>::size_type

本文关键字:gt size type int lt 用法 向量      更新时间:2023-10-16

我在一些关于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_typetypedefstd::size_t反过来又会unsinged int,但在这里我们将int存储在vector中。

请澄清我对vector<int>::size_type的理解。在上面的 for 循环中使用它公平吗?

基本上,上面的代码是"好的",因为它编译并完成了预期的工作,正如其他人所说。

当他们说目的是在向量中插入十个ints时,由于循环的格式化方式,ints保证为正,因此unsigned int将转换为int

但是,我不认为这是您所说的好做法 - 大小类型与要插入的元素的类型无关 - 大小类型基本上总是一个unsigned int.仅使用intvalue_type显然会使代码的意图更加清晰。

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

vector::size_type/size_t应始终用于矢量索引,但如果vectorint,则应在其中插入ints。

正确的代码是:

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,它本身是一些大的无符号类型的标准别名,尽管对于可移植程序,您通常无法预测哪一个。


但。。。!

这个特殊的例子令人困惑,因为书籍作者实际上是使用大小类型填充向量。这不一定是"错误的":在 0-9 的范围内,它不会中断。编译器将仅以通常的方式隐式转换整数。

但它表达意图不正确。

我想它曾经看起来像这样:

vector<int> v(5);
for (vector<int>::size_type i = 0; i < v.size(); i++)
v[i] = 42;

然后有人更改了循环体(使得现在i用于值,而不是索引(,并且没有考虑更改循环前导码。

使i成为int将更加清晰和明显。

总的来说,我会考虑避免这些"知名书籍",或者至少检查它们的勘误表,看看代码在出版后是否进行了调整,因为这是一个非常奇怪的C++例子。