与size_t进行比较,返回int?
题
我正在写一些代码示例,从“如何像C ++中的计算机科学家思考”中,这是关于处理播放卡类型对象和甲板的代码示例。我面临着这种情况:
int Card::find(const std::vector<Card>& deck) const {
size_t deckSize = deck.size();
for (size_t i=0; i<deckSize; i++)
if (equals(*this, deck[i])) return i;
return -1;
}
我无法像文本中的Visual Studio 2010中的C ++的向量上使用“ .length()”,而是必须使用.size()返回(我相信)std :: size_type。我认为我可以使用size_t并逃脱它,以避免在阅读时避免不同的架构上的问题,但是我想知道我是否返回 i
, ,但是它比整数大,我会崩溃该程序吗?
在我的问题上被编辑为更具体:]一旦我开始使用矢量来比卡更大的事物,我考虑使用无符号int,因为编译器不匹配警告,但是我觉得返回无签名的int或int有一些问题:1) INT不会采用足够大的向量指数。 2)返回未签名的int不会让我返回-1。 3)未签名的int在所有架构上都不等于size_t(我也在ARM Cortex-M3上进行微控制器编程)。
如果我有足够大的矢量,该怎么办?
解决方案
铸造 size_t
至 int
不会“崩溃”您的程序,但这是一种不良习惯。另一方面,STL包括不错 find
您正在做什么的算法。
其他提示
INT在32 /64位Windows和Linux上为32位。如果在31日大于两个,我将被截断。您可以使用未签名的int,除非在向量中存储超过4 g的元素,否则您的程序会很好:)
size_t
通常是一个 unsigned int
但是你不能依靠这一点。如果比一个大 int
您不会崩溃,只会溢出到(可能是负)的数字。
假设您不会在一个矢量中拥有数千张卡片,我很高兴返回 int
.
你也可以返回 std::pair<size_t, bool>
, , 如同 std::map insert()
. 。第二个模板参数意味着成功或失败。
如果可以的话,也可以使用 boost ::可选