0

我有一个向量,它最多可以容纳 10 个对象。当我创建向量时,我相信它会创建它将持有的类的 10 个“空白”对象。因此我遇到了一个问题,因为我的代码依赖于检查向量元素是否为空,并且显然它永远不会为空。

如何检查向量对象是否包含我插入的元素,或初始化时的默认构造函数“空白”对象之一?

这个有技巧吗?

(我需要检查null,因为我正在编写递归算法和终止点,当递归函数返回时,向量中的对象为null)

4

3 回答 3

1

std::vector仅插入“真实”对象。它(至少通常)分配原始内存,并根据需要使用新位置在该内存中构造对象。它将包含的唯一对象将是您放置在那里的对象。

当然,如果您愿意,您可以创建一个向量,其中包含您传递给构造函数的对象的多个副本。同样,当你resize是一个向量时,你传递一个对象,如果你让它变大,它会复制到新的位置。

不过,这两者都不是真正的常态。在典型情况下,您只需创建一个vector,它将开始包含 0 个对象。您将使用push_back将对象添加到vector. 当您搜索 时vector,唯一的对象将是您与 一起放在那里的对象push_back,您无需担心它是否包含任何其他对象。

如果您只想检查是否vector为空,您可以使用:

if (your_vector.empty())

true...如果它是空的并且false它包含至少一个对象,它将(显然足够)返回。

于 2012-05-27T01:12:47.553 回答
1

类的实例不能为空。只有一个指针。

但是,您确实拥有可以使用的 size() 。

typedef stdd::vector<SomeClass> vec;
//define some vec, v
for (vec::size_type i = 0, s = vec.size(); i < s; ++i) {
    //do something with v[i]
}

使用递归函数,您可以通过传递最大索引来使用这个想法。

void recursiveFunc(vec& v, vec::size_type s);

然后当检查你的条件递归时,你需要检查“我在向量的末尾吗?”

或者,您可以使用迭代器,而不是处理索引:

template <typename Iterator>
void recursiveFunc(Iterator begin, const Iterator& end);

如果做得正确(如果可能的话),这可以使您的操作与了解存储在向量中的基础数据脱钩。

遍历向量的循环将如下所示:

while (begin != end) {
    //do something with *begin
    ++begin;
}
于 2012-05-27T00:49:38.297 回答
0

正如@Corbin 提到的, size() 将返回向量中的元素数。保证中间没有任何孔(连续),所以你保证 vector[vector.size()] 是空的。

于 2012-05-27T00:51:30.697 回答