与size_t比较,返回int?

时间:2010-12-16 04:28:45

标签: c++ object vector int size-t

我正在编写一些代码示例来自“如何像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上进行单片机编程)。

如果我有足够大的矢量,我该怎么办?

4 个答案:

答案 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