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