检查元素是否存在于Vector中

时间:2012-05-27 00:47:22

标签: c++ vector std

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

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

这周围有技术吗?

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

3 个答案:

答案 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_backvector添加对象。当您搜索vector时,唯一的对象就是您使用push_back放置的对象,并且您不必担心它包含任何其他对象的可能性。

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

if (your_vector.empty())

...如果它是空的,那么(很明显就会)返回true,如果它包含至少一个对象,则会false

答案 2 :(得分:0)

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