size_type和int之间的区别

时间:2014-03-16 13:01:19

标签: c++ vector stl

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<double> student_marks(20);

    for (vector<double>::size_type i = 0; i < 20; i++)
    {
        cout << "Enter marks for student #" << i+1 
            << ": " << flush;
        cin >> student_marks[i];
    }
    return 0;
}

我在某处读到,最好使用size_type代替int。它是否真的对实施产生了巨大影响?使用size_type的积极因素是什么?

3 个答案:

答案 0 :(得分:7)

vector<double>::size_type保证涵盖vector<double>大小的所有可能值。 int不是。

请注意,vector<double>::size_type通常与std::size_t相同,因此通常可以使用后者。但是,自定义分配器可能会导致size_typestd::size_t不同的向量。

答案 1 :(得分:3)

使用size_type而不是size_t的积极因素只是符合性。纯粹通过联想,通过死记硬背和理性来学习的人很高兴。他们确实喜欢看到像他们一样的人,并希望将其视为“正确”。

size_type成员是容器大小类型的自定义点。它来自allocator模板参数。使用默认的标准分配器,它只是size_t的同义词,即默认情况下,相同的类型

int的问题,与签名类型ptrdiff_t(指针差异的结果类型)相反,int可能没有足够的范围来实现真正巨大的向量在64位系统上。

size_t的问题在于它很容易导致在混合类型表达式中无意中使用模运算。例如,表达式std::string( "Hi!" ).length() < -7将始终产生true。因此,它是一个错误吸引者,所以ptrdiff_t,或者当您确定范围时,只是简单int,非常客观上是可取的(即使它可能会令上述人员感到不快非常 - 使用客观劣等的解决方案仍然存在非常强大的社会压力。)

在标准库中,无符号类型size_t用于历史原因

特别是在16位系统上,内存是一种非常有限的资源,并且必须使用每一个小脏技巧才能完全利用它 - 对于那些小系统,在那些日子里,它非常值得一些环绕式错误的风险等。今天它不是。

答案 2 :(得分:3)

size_type是一个无符号号码。这意味着它不能是负面的。对于容器尺寸而言,这听起来可能是合乎逻辑的选择,但在现实生活中会产生很多问题

例如,当你从另一个size_type中减去一个std::vector<double>::size_type size1 = v1.size(); std::vector<double>::size_type size2 = v2.size(); if ((size1 - size2) > 5) // dangerous if v2 is bigger than v1! { // ... } 时,如果第二个操作数大于第一个操作数,结果将无声地转换为一个巨大的正数:

void f(std::vector<double>::size_type size)
{
    if (size < 0)
    {
        // error handling will never be reached    
    }
}

f(-1); // no error handling

它经常使错误检查变得不可能:

int

对于此类问题,您通常在代码中更喜欢(签名)unsignedstatic_cast,而且标准库容器将其大小表示为无符号数字是不幸的。您通常希望尽快将(int)尺寸转换为带符号的数字。在你的例子中,保持无符号是好的,因为它只是循环索引,并且首先转换为size_type会过度设计IMO。

好消息是,您通常可以使用迭代器完全避免for (std::vector<double>::const_iterator iter = v.begin(); iter != v.end(); ++iter) { std::cout << *iter; }

{{1}}

我邀请您看看Scott Meyers的Signed and Unsigned Types in Interfaces

最后,请注意这位经验丰富的C ++程序员并非普遍共享。在网上搜索有关此主题的过去讨论(旧的Stackoverflow问题,comp.lang.c ++ Usenet存档等)将揭示不同的意见。