我只是想知道我是否应该使用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的最佳实践是什么?
当前回答
使用std::size_t对c风格数组进行索引/计数。
对于STL容器,你会有(例如)vector<int>::size_type,它应该用于索引和计数vector元素。
实际上,它们通常都是无符号整型,但这并不能保证,特别是在使用自定义分配器时。
其他回答
Size_t是unsigned int。所以当你需要unsigned int时,你可以使用它。
我使用它当我想指定数组的大小,计数器等…
void * operator new (size_t size); is a good use of it.
根据定义,size_t是sizeof操作符的结果。创建Size_t是为了引用大小。
你做某事的次数(在你的例子中是10次)与大小无关,那么为什么要使用size_t呢?Int,或者unsigned Int,应该是可以的。
当然,你在循环中对i做什么也是相关的。例如,如果将它传递给一个接受无符号整型的函数,则选择无符号整型。
在任何情况下,我都建议避免隐式类型转换。使所有类型转换显式。
通常最好不要在循环中使用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是一种非常易读的方式来指定项的大小维度——字符串的长度,指针占用的字节数,等等。 它也可以跨平台移植——你会发现64位和32位都可以很好地使用系统函数和size_t——这是unsigned int可能做不到的(例如,什么时候应该使用unsigned long
当使用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
我想听听其他人的意见。