C++ 检查向量中是否存在元素

C++ 检查向量中是否存在元素,c++,vector,std,C++,Vector,Std,我有一个向量,它最多能容纳10个物体。当我创建向量时,我相信它会创建10个它将持有的类的“空白”对象。因此,我遇到了一个问题,因为我的代码依赖于检查向量元素是否为null,而且显然它从来都不是null 如何检查向量对象是否包含我插入的元素,或者初始化时是否包含默认构造函数“blank”对象 这有什么技巧吗 (我需要检查null,因为我正在编写递归算法,递归函数返回的终止点是向量中的对象为null)类的实例不能为null。只有一个指针 但是,您确实有可以使用的size() typedef stdd

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

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

这有什么技巧吗


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

类的实例不能为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]
}
然后,当检查递归条件时,需要检查“我在向量的末尾吗?”

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

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

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

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

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

但这两种情况都不是真正的标准。在典型情况下,您只需创建一个
向量
,该向量从包含0个对象开始。您将使用
push_back
向量添加对象。当您在
向量中搜索时
,唯一的对象将是您用
推回
放置在那里的对象,您不必担心它包含任何其他对象的可能性

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

if (your_vector.empty())

…如果它是空的,则返回
true
,如果它至少包含一个对象,则返回
false

它是否包含“空白”对象(实际上它们是默认构造的实例)取决于您使用的是
resize(10)
还是
reserve(10)
。如果我创建了一个初始块大小为10的向量,如果我没有在向量中插入任何内容,那么大小将是0?@user997112:是的。而且它必须是连续的。@Corbin:notso--a
vector
不会将默认构造的项插入到它分配的未使用空间中。它通常通过分配原始内存来工作,然后在需要时使用placement new在该内存中构造项,但是您没有插入任何内容的内存只是原始内存,而不是对象。@JerryCoffin啊,这是真的。我应该多想想,这并不是说,我只是想知道整个向量是否是空的,是否充满了非真实的物体
while (begin != end) {
    //do something with *begin
    ++begin;
}
if (your_vector.empty())