C ++标准模板库矢量问题

时间:2011-03-03 19:12:47

标签: c++ vector standard-library

有人可以用英语解释这里发生了什么吗?

std::vector<Cat*> cats; //I get that cats is a vector of Cat objects

if (std::find(cats.begin(), cats.end(), morris) == cats.end()) {
   cats.push_back(morris);
}

6 个答案:

答案 0 :(得分:5)

@mlimber已经给出了一个解释。

我的解释有点不同。用简单的英语,这是一种非常简单的方法:

 std::set<Cat> cats;

 cats.insert(morris);

并使其变慢(线性而非对数)并且难以阅读或理解。

编辑:公平地说,我想我应该添加 想要做这样的事情的几个原因。例如,如果您确实需要知道将Cat添加到集合中的顺序,则保留原始顺序可能会有所帮助。同样地,如果您通常使用该集合的方式受益于它们在内存中是连续的,并且只有很少添加新项目,那么它可能更有意义将数据存储在vector而不是set

然而,set旨在完全在这里完成的工作,因此set是显而易见的选择(没有令人信服的理由使用{{1}只是在你所展示的内容中看不到。)

答案 1 :(得分:2)

它向向量morris添加了一个名为cats的项目,如果该向量还没有它!

std::find用于检查项morris是否在向量cats中。它没有,std::find返回的值将等于cats.end()。在此之后,其他一切都非常直接。

答案 2 :(得分:1)

假设代码是正确的(比如morris的类型和初始化以及使用指针进行比较),重点是看看morris是否在猫的集合中,如果没有,则将其添加到它。

答案 3 :(得分:1)

cat是指向Cat对象的指针向量,而不是Cat对象的向量。

这会搜索所有猫(cats.begin()到cats.end())以查找等于morris的对象(指向cat的指针)

std::find(cats.begin(), cats.end(), morris)

返回值是指向对象的向量中的迭代器(如果找到它),如果找不到则返回结束迭代器(cats.end())。考虑到这一点,这个:

if (std::find(cats.begin(), cats.end(), morris) == cats.end())

是一个测试,看猫是否包含该对象(莫里斯)。如果没有,那么它执行:

cats.push_back(morris);

将对象(morris)放入向量中。

答案 4 :(得分:1)

首先要小心:你的评论是错误的。猫不是猫对象的矢量,而是猫对象的POINTERS矢量。

现在,声明:

std :: find(cats.begin(),cats.end(),morris)

暗示你有一个名叫morris的Cat *。这个语句将在两个提供的迭代器(即:cats.begin()和cats.end())之间搜索向量,以获得指向Cat的指针,等于morris(相同的地址)。如果没有找到,std :: find返回第二个迭代器,因此,在你的情况下“cats.end()”

因此“if(std :: find(cats.begin(),cats.end(),morris)== cats.end()){cats.push_back(morris);}”的意思是,用简单的英语如果莫里斯还不在猫的载体中,那就把它放在最后“

如果我们不知道到底有什么打扰你,我会很难更具体

答案 5 :(得分:0)

std::vector<Cat*> cats; //I get that cats is a vector of Cat objects

你弄错了。 catsstd::vector指向类Cat的指针。有一点不同:Cat驻留在堆栈上,通过执行

创建
Cat morris;

并且不必删除。如示例中的指针由

创建
Cat* morris = new Cat();

并且在你扔掉指针之前必须删除它:

delete morris;

我现在将为您的示例添加一些代码:

Cat* morris = new Cat();

if (std::find(cats.begin(), cats.end(), morris) == cats.end()) {
   cats.push_back(morris);
}

这将在堆上创建一个类型为morris的动态分配对象Cat。然后,std::find用于在向量cats中搜索新创建的对象,该对象将始终在此代码片段中失败。如果std::find失败,它会向容器中的最后一个元素返回一个迭代器(这正是std::vector::end()返回的那个)。因此,如果找不到morris,代码将在向量的后面创建一个新元素,并向其添加morris