我只是想知道我是否应该使用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是一种无符号类型,它可以为您的体系结构保存最大整数值,因此它不会因为符号(有符号int 0x7FFFFFFF加1会得到-1)或短大小(无符号短int 0xFFFF加1会得到0)而导致整数溢出。
它主要用于数组索引/循环/地址算法等。像memset()这样的函数只接受size_t,因为理论上你可能有一个大小为2^32-1的内存块(在32位平台上)。
对于这样简单的循环,不要麻烦,只使用int。
通常最好不要在循环中使用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,这也是不好的。
很快,大多数计算机将是64位体系结构,带有64位操作系统,运行在数十亿个元素的容器上的程序。然后必须使用size_t而不是int作为循环索引,否则在32位和64位系统上,索引将在2^32:th元素处换行。
为未来做好准备!
Size_t是一个无符号整型,它可以表示系统中最大的整数。 只有当你需要非常大的数组,矩阵等。
有些函数返回size_t,如果你试图进行比较,编译器会警告你。
通过使用适当的有符号/无符号数据类型或简单的类型转换来避免快速破解。