2012-05-27 108 views
0

我有一个矢量,它最多会保存10个对象。当我创建矢量时,我相信它会创建该类将保存的10个“空白”对象。因此,我有一个问题,因为我的代码依赖于检查矢量元素为空,显然它不会为空。检查矢量中是否存在元素

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

这是否有一种技术呢?

(我需要检查空,因为我写一个递归算法和终止点,当递归函数返回时的矢量对象为null)

+0

它是否包含“空白”对象(实际上它们是默认构造的实例)取决于您是使用“resize(10)”还是“reserve(10)”。 –

回答

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; 
} 
+0

因此,如果我创建了一个初始块大小为10的Vector,如果我没有插入任何东西到Vector中,大小将为0? (并且我假定容量为10) – user997112

+0

@ user997112:是的。它必须是连续的。 –

+0

@Corbin:并非如此 - “vector”不会*将*默认构造的项目插入到已分配的未使用空间中。它通常通过分配原始内存来工作,然后在需要时使用placement new来构造内存中的项目,但未插入任何东西的内存仅仅是原始内存,而不是对象。 –

0

正如@Corbin提到,大小()将返回矢量中元素的个数。它是保证没有任何漏洞之间(连续),所以你确定矢量[vector.size()]是空的。

+0

它不是那么多,我只是想能够判断整个向量是否为空并且充满了非真实对象 – user997112

1

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

当然,如果你想要想要,你可以创建一个包含你传递给构造函数的对象的拷贝数的向量。同样的,当你使用矢量的时候,如果你把它放大,你会传入一个对象,它会复制到新的位置。

这些都不是真正的常态。在典型情况下,您只需创建一个包含0个对象的vector。您将使用push_back将对象添加到vector。当您通过vector进行搜索时,唯一的对象将是您在push_back中放置的对象,您不必担心它包含任何其他对象的可能性。

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

if (your_vector.empty()) 

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