5

我正在写一些来自“如何像 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 并摆脱它,以避免在不同架构上出现问题,正如我一直在阅读的那样,但我想知道如果我 return i,但它大于一个整数,我会崩溃程序吗?

[在我的问题中编辑得更具体:]一旦我开始将向量用于比卡片更大的东西,我考虑使用 unsigned int 因为编译器不匹配警告,但我觉得返回 unsigned int 或 int 有一些问题:1) int 不会采用足够大的向量索引。2) 返回 unsigned int 不会让我返回 -1。3) unsigned int 在所有架构上都不等于 size_t (我也在 ARM Cortex-M3 上进行微控制器编程)。

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

4

4 回答 4

3

size_tto 转换int不会“崩溃”你的程序,但这是一个不好的坏习惯。另一方面,STLfind为您正在做的事情提供了很好的算法。

于 2010-12-16T04:34:36.693 回答
2

int 在 32 / 64 位 Windows 和 Linux 上是 32 位的。如果在 31 日超过两个,我将被截断。你可以使用 unsigned int 并且你的程序会很好,除非在向量中存储超过 4 个 G 元素:)

于 2010-12-16T04:37:02.887 回答
0

size_t通常是一个,unsigned int但你不能依赖它。如果它大于int你不会崩溃,你只会溢出到一个(可能是负数)数字。

假设您不会在一个向量中包含数万张卡片,我很乐意返回int.

于 2010-12-16T04:33:59.580 回答
0

也可以返回std::pair<size_t, bool>,类似std::map insert()。第二个模板参数表示成功或失败。

如果你没问题,你也可以使用boost::optional

于 2010-12-16T05:22:58.440 回答