我正在编写一些代码示例来自“如何像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()”,而是必须使用返回(我相信)std :: size_type的.size()。我想我可以使用size_t并躲开它以避免不同架构上的问题,就像我一直在阅读,但我想知道我是否返回i
,但它大于整数,我会不会崩溃程序?
[编辑在我的问题中更具体:] 一旦我开始使用向量比卡更大的东西,我考虑使用unsigned int因为编译器不匹配警告,但我觉得返回unsigned int或int有一些问题:1)int将不会采用足够大的向量索引。 2)返回unsigned int不会让我返回-1。 3)unsigned int在所有架构上都不等于size_t(我也在ARM Cortex-M3上进行单片机编程)。
如果我有足够大的矢量,我该怎么办?
答案 0 :(得分:3)
从size_t
投射到int
不会“崩溃”您的程序,但这是一个糟糕的不良做法。另一方面,STL为你正在做的事情包含了很好的find
算法。
答案 1 :(得分:2)
int在32/64位Windows和Linux上为32位。如果在31日大于2,我将被截断。您可以使用unsigned int,除非在向量中存储超过4个G元素,否则您的程序将没有问题。)
答案 2 :(得分:0)
size_t
通常是unsigned int
,但您不能依赖它。如果它大于int
你不会崩溃,你只会溢出一个(可能是负数)。
假设你不会在一个向量中拥有数万张牌,我会很高兴返回int
。
答案 3 :(得分:0)
您也可以返回std::pair<size_t, bool>
,类似于std::map insert()
。第二个模板参数意味着成功或失败。
如果你对此感到满意,你也可以使用boost::optional