5

返回向量大小的 getter 应该返回什么类型的值?

例如,我的项目中有许多以下类型的吸气剂,我需要(int)强制转换来删除编译警告:

int getNumberOfBuildings() const { return (int)buildings.size(); }
4

5 回答 5

25

C++03方式:

std::vector<Building>::size_type getNumberOfBuildings() const
{ return buildings.size(); }

C++11 方式:

auto getNumberOfBuildings() const -> decltype(buildings.size())
{ return buildings.size(); }

C++14 方式:

auto getNumberOfBuildings() const
{ return buildings.size(); }
于 2013-07-06T20:40:07.603 回答
5

你应该返回一个std::size_t. 是使用默认分配器时 std::size_t的返回类型。当您使用默认分配器(您最有可能使用)时,返回它只是一个 typedef 。vector<T>::size()vector<T>::size()vector<T>::size_typestd::size_t

于 2013-07-06T20:39:00.393 回答
3

std::vector提供了一个 typedef, std::vector<>::size_type,它指示用作结果的类型vector::size

std::vector<TYPE>::size_type getNumberOfBuildings() const { return buildings.size(); }

但是,这通常是size_t,因此您可以继续直接使用后者:

#include <cstddef>

std::size_t getNumberOfBuildings() const { return buildings.size(); }
于 2013-07-06T20:39:46.053 回答
3

如其他答案所述,正式答案确实是std::vector<Building>::size_type

真正的答案取决于您的程序中是否已经有一个类型来表示建筑物的数量。它可能是int,它可能是unsigned或者它可能是某个 typedef 名称TBuildingCount。这是您在这种情况下应该使用的类型。它可能需要强制转换来抑制编译器警告,但通常就是这样。

我没有看到你的其余代码,所以我不能肯定地说,但我猜建筑物存储在某个向量中(或任何其他容器)的事实只是一个实现细节,这不会影响您选择计算这些建筑物的类型。没有必要暴露该容器的存在(或依赖它),即使以间接的方式使用它size_type来返回计数。

换句话说,如果您已经决定使用int计数建筑物,那么您问题中的实现就是您应该坚持的。

于 2013-07-06T21:34:02.310 回答
1

与许多其他答案相比,您的函数的返回值实际上更多地取决于您的界面,而不是您在后台使用的内容。您是否返回向量的大小并希望每个人都知道它?好吧,那就继续使用std::vector::size_type. 但是你是否真的返回了一些抽象的计数变量,比如建筑物的数量,那么我认为 a 不std::vector::size_type属于你的界面,因为这只是一个实现细节。

如果它是您返回的东西的大小(但不一定知道是引擎盖下的向量),我会使用 good old std::size_t,但如果它是某种东西的计数,那么 anunsigned int在概念上更合适。当然,没有人保证 a unsigned intorstd::size_t可以容纳任意的大小std::vector,但话又说回来,它不是任意的std::vector,它是一组建筑物,你自己应该知道是否可以有比std::numeric_limits<unsigned int>::max()建筑物更多的东西。

于 2013-07-30T12:56:19.553 回答