我有一个向量,它最多可以容纳 10 个对象。当我创建向量时,我相信它会创建它将持有的类的 10 个“空白”对象。因此我遇到了一个问题,因为我的代码依赖于检查向量元素是否为空,并且显然它永远不会为空。
如何检查向量对象是否包含我插入的元素,或初始化时的默认构造函数“空白”对象之一?
这个有技巧吗?
(我需要检查null,因为我正在编写递归算法和终止点,当递归函数返回时,向量中的对象为null)
std::vector
仅插入“真实”对象。它(至少通常)分配原始内存,并根据需要使用新位置在该内存中构造对象。它将包含的唯一对象将是您放置在那里的对象。
当然,如果您愿意,您可以创建一个向量,其中包含您传递给构造函数的对象的多个副本。同样,当你resize
是一个向量时,你传递一个对象,如果你让它变大,它会复制到新的位置。
不过,这两者都不是真正的常态。在典型情况下,您只需创建一个vector
,它将开始包含 0 个对象。您将使用push_back
将对象添加到vector
. 当您搜索 时vector
,唯一的对象将是您与 一起放在那里的对象push_back
,您无需担心它是否包含任何其他对象。
如果您只想检查是否vector
为空,您可以使用:
if (your_vector.empty())
true
...如果它是空的并且false
它包含至少一个对象,它将(显然足够)返回。
类的实例不能为空。只有一个指针。
但是,您确实拥有可以使用的 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;
}
正如@Corbin 提到的, size() 将返回向量中的元素数。保证中间没有任何孔(连续),所以你保证 vector[vector.size()] 是空的。