我有一个矢量,它最多会保存10个对象。当我创建矢量时,我相信它会创建该类将保存的10个“空白”对象。因此,我有一个问题,因为我的代码依赖于检查矢量元素为空,显然它不会为空。检查矢量中是否存在元素
如何检查矢量对象是否包含插入的元素,或初始化时默认的构造函数“空白”对象之一?
这是否有一种技术呢?
(我需要检查空,因为我写一个递归算法和终止点,当递归函数返回时的矢量对象为null)
我有一个矢量,它最多会保存10个对象。当我创建矢量时,我相信它会创建该类将保存的10个“空白”对象。因此,我有一个问题,因为我的代码依赖于检查矢量元素为空,显然它不会为空。检查矢量中是否存在元素
如何检查矢量对象是否包含插入的元素,或初始化时默认的构造函数“空白”对象之一?
这是否有一种技术呢?
(我需要检查空,因为我写一个递归算法和终止点,当递归函数返回时的矢量对象为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]
}
使用递归函数,您可以通过传递最大索引来使用此想法。
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;
}
因此,如果我创建了一个初始块大小为10的Vector,如果我没有插入任何东西到Vector中,大小将为0? (并且我假定容量为10) – user997112
@ user997112:是的。它必须是连续的。 –
@Corbin:并非如此 - “vector”不会*将*默认构造的项目插入到已分配的未使用空间中。它通常通过分配原始内存来工作,然后在需要时使用placement new来构造内存中的项目,但未插入任何东西的内存仅仅是原始内存,而不是对象。 –
正如@Corbin提到,大小()将返回矢量中元素的个数。它是保证没有任何漏洞之间(连续),所以你确定矢量[vector.size()]是空的。
它不是那么多,我只是想能够判断整个向量是否为空并且充满了非真实对象 – user997112
std::vector
只插入“真实”的对象。它(至少通常)分配原始内存,并根据需要使用placement new来在该内存中构造对象。它将包含的唯一对象将是你放在那里的对象。
当然,如果你想要想要,你可以创建一个包含你传递给构造函数的对象的拷贝数的向量。同样的,当你使用矢量的时候,如果你把它放大,你会传入一个对象,它会复制到新的位置。
这些都不是真正的常态。在典型情况下,您只需创建一个包含0个对象的vector
。您将使用push_back
将对象添加到vector
。当您通过vector
进行搜索时,唯一的对象将是您在push_back
中放置的对象,您不必担心它包含任何其他对象的可能性。
如果你只是想检查vector
是否为空,你可以使用:
if (your_vector.empty())
...这将(显然不够)返回true
如果它是空的,false
如果它至少包含一个对象。
它是否包含“空白”对象(实际上它们是默认构造的实例)取决于您是使用“resize(10)”还是“reserve(10)”。 –