【问题标题】:C++ self-enforcing a standard: size_tC++ 自执行标准:size_t
【发布时间】:2015-04-29 14:43:05
【问题描述】:

简单的问题, 强迫自己在处理数组或其他大型数据结构时通常使用整数的地方开始使用 size_t(或无符号长整数?)对我有好处吗?

假设你有一个向量指针:

auto myVectorPtr = myVector;

你不知道,这个向量的大小大于:

std::numeric_limits<int>::max();

你有一个循环:

for(int i = 0; i < myVectorPtr->size(); ++i)

不是更好吗

for(size_t i = 0; i < myVectorPtr->size(); ++i)

为了避免溢出?

我想我的问题确实是,在算术和其他常见操作中使用 size_t(或无符号长整数?)是否有任何副作用。如果我开始使用 size_t(或 unsigned longs?)而不是经典的 int,有什么需要注意的吗?

【问题讨论】:

  • 我相信 size_t 类型取决于平台。错误
  • 使用正确的类型通常是个好习惯。如果这意味着std::size_t,因为这是函数返回的内容,那么使用std::size_t;如果不合适,标准将不会返回。请注意,解决此问题的一种方法是根本不使用索引:for (auto const&amp; v : myVector) { ... }
  • @amchacon,您会注意到,它由std::vector::size_type 表示,并且可以大于int 表示的最大数字。
  • 如果size_t 不是intfor(int i = 0; i &lt; myVectorPtr-&gt;size(); ++i) 会生成警告。通常使用-Wall-Werror 是一种很好的做法(或其他编译器的等效项)。

标签: c++ int size-t


【解决方案1】:

size_t 肯定比int 好。最安全的做法是使用容器的实际size_type,例如:

for( typename decltype(*myVectorPtr)::size_type i = 0; i < myVectorPtr->size(); ++i )

很遗憾,auto 不能在此处使用,因为它会从 0 而非 size() 调用中推断其类型。

使用迭代器或基于范围的接口会更好看:

for (auto iter = begin(*myVectorPtr); iter != end(*myVectorPtr); ++iter)

for (auto &&item : *myVectorPtr)

【讨论】:

  • 对于vector,它的size_type不能大于size_t,所以你可以使用size_t;但是理论上其他没有连续要求的容器类型(例如deque)可能有更大的size_type
  • 第一个代码块是一个真正的大嘴:P 无论如何,有时您需要大小变量i 来在循环中执行一些算术。但在其他情况下,我同意迭代器方式会更受欢迎。
  • 另外,最后一个 for 语法的名称是什么?对我来说看起来像一个 foreach,但在 C++ 中,foreach 显然是 something different.
  • @MattMcNabb,对于非 stl 容器,例如 T*(通用数组)呢?
  • 如果您指的是 C 样式数组,请在此处使用 size_t
猜你喜欢
  • 2020-01-05
  • 2021-04-06
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
  • 2012-03-09
  • 2012-07-02
  • 2010-12-21
  • 1970-01-01
相关资源
最近更新 更多