我只是想知道我是否应该使用std::size_t for循环之类的东西,而不是int? 例如:
#include <cstdint>
int main()
{
for (std::size_t i = 0; i < 10; ++i) {
// std::size_t OK here? Or should I use, say, unsigned int instead?
}
}
一般来说,关于何时使用std::size_t的最佳实践是什么?
我只是想知道我是否应该使用std::size_t for循环之类的东西,而不是int? 例如:
#include <cstdint>
int main()
{
for (std::size_t i = 0; i < 10; ++i) {
// std::size_t OK here? Or should I use, say, unsigned int instead?
}
}
一般来说,关于何时使用std::size_t的最佳实践是什么?
当前回答
Size_t由各种库返回,以指示该容器的大小非零。你用它当你得到一次:0
然而,在上面的例子中,循环size_t是一个潜在的错误。考虑以下几点:
for (size_t i = thing.size(); i >= 0; --i) {
// this will never terminate because size_t is a typedef for
// unsigned int which can not be negative by definition
// therefore i will always be >= 0
printf("the never ending story. la la la la");
}
使用无符号整数有可能产生这类微妙的问题。因此,依我之见,我更喜欢只在与需要size_t的容器/类型交互时使用size_t。
其他回答
Size_t是sizeof操作符的结果类型。
size_t用于对数组的大小或索引进行建模的变量。Size_t传达语义:您立即知道它表示字节或索引的大小,而不仅仅是另一个整数。
此外,使用size_t表示字节大小有助于使代码可移植。
通常最好不要在循环中使用size_t。例如,
vector<int> a = {1,2,3,4};
for (size_t i=0; i<a.size(); i++) {
std::cout << a[i] << std::endl;
}
size_t n = a.size();
for (size_t i=n-1; i>=0; i--) {
std::cout << a[i] << std::endl;
}
第一个循环就可以了。但是对于第二个循环: 当i=0时,i——的结果将是ULLONG_MAX(假设size_t = unsigned long long),这不是你在循环中想要的结果。 此外,如果a是空的,那么n=0和n-1=ULLONG_MAX,这也是不好的。
Size_t是一个无符号整型,它可以表示系统中最大的整数。 只有当你需要非常大的数组,矩阵等。
有些函数返回size_t,如果你试图进行比较,编译器会警告你。
通过使用适当的有符号/无符号数据类型或简单的类型转换来避免快速破解。
一个很好的经验法则是,对于需要在循环条件中与std::size_t本身的东西进行比较的任何东西。
std::size_t是任何sizeof表达式的类型,as被保证能够在c++中表示任何对象(包括任何数组)的最大大小。通过扩展,它也保证足够大,可以用于任何数组下标,因此它是数组上按下标循环的自然类型。
如果你只是数到一个数字,那么使用保存该数字的变量类型或int或unsigned int(如果足够大)可能更自然,因为这些应该是机器的自然大小。
当使用size_t时,注意下面的表达式
size_t i = containner.find("mytoken");
size_t x = 99;
if (i-x>-1 && i+x < containner.size()) {
cout << containner[i-x] << " " << containner[i+x] << endl;
}
不管x的值是多少,if表达式都会得到false。 我花了几天时间才意识到这一点(代码太简单了,我没有做单元测试),尽管只花了几分钟就找到了问题的根源。不确定是执行强制转换还是使用零更好。
if ((int)(i-x) > -1 or (i-x) >= 0)
两种方法都有效。这是我的测试
size_t i = 5;
cerr << "i-7=" << i-7 << " (int)(i-7)=" << (int)(i-7) << endl;
输出:i-7=18446744073709551614 (int)(i-7)=-2
我想听听其他人的意见。