有人可以用英语解释这里发生了什么吗?
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);
}
答案 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
你弄错了。 cats
是std::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
。