有人可以用英语解释这里发生了什么吗?
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);
}
有人可以用英语解释这里发生了什么吗?
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);
}
@mlimber 已经给出了一种解释。
我会稍微解释一下。用简单的英语来说,这是一种非常简单的方法:
std::set<Cat> cats;
cats.insert(morris);
并使其变慢(线性而不是对数)并且相当难以阅读或理解。
编辑:公平地说,我想我应该补充一点,你可能想做这样的事情有几个原因。例如,如果您确实需要知道s 添加到集合中的顺序,那么保留原始顺序可能会有意义。同样,如果您通常以一种受益于它们在内存中连续的方式使用集合,并且很少添加新项目,那么将数据存储在 a 中可能比a 更有意义。Cat
vector
set
但是, Aset
旨在完全执行此处正在执行的操作,因此 aset
是显而易见的选择(没有令人信服的理由来使用 avector
在您所显示的内容中不可见)。
如果向量还没有它,它会添加一个称为morris
向量的项目!cats
std::find
用于检查项目是否morris
在向量中cats
。它没有,std::find
返回值将等于cats.end()
. 在此之后,其他一切都非常简单。
cat 是指向 Cat 对象的指针向量,而不是 Cat 对象的向量。
这会在所有猫(cats.begin() 到 cat.end())中搜索等于 morris 的对象(指向猫的指针)
std::find(cats.begin(), cats.end(), morris)
如果找到,则返回值是指向指向该对象的向量的迭代器,如果未找到,则返回结束迭代器(cats.end())。考虑到这一点,这:
if (std::find(cats.begin(), cats.end(), morris) == cats.end())
是测试猫是否包含该对象(莫里斯)。如果没有,则执行以下操作:
cats.push_back(morris);
它将对象(莫里斯)放入向量中。
首先要小心:您的评论是错误的。cat 不是 Cat 对象的向量,而是指向 cat 对象的 POINTERS 向量。
现在,声明:
std::find(cats.begin()、cats.end()、莫里斯)
暗示你在某处有一只猫*,叫做莫里斯。该语句将在两个提供的迭代器(即:cats.begin() 和cats.end())之间搜索向量,寻找指向 Cat 的指针,等于 morris(相同的地址)。如果没有找到,std::find 返回第二个迭代器,所以,在你的情况下是“cats.end()”
因此,“if (std::find(cats.begin(), cats.end(), morris) == cats.end()) {cats.push_back(morris); }”用简单的英文表示“如果 morris '还没有在猫向量中,把它放在最后"
如果我们不知道到底是什么困扰着您,我将很难说得更具体
假设代码是正确的(比如 morris 的类型和初始化以及使用指针进行比较),关键是查看 morris 是否在猫的集合中,如果没有,则将他添加到其中。
std::vector<Cat*> cats; //I get that cats is a vector of Cat objects
你弄错了。cats
是一个std::vector
指向类的指针Cat
。有一个区别:Cat
s 驻留在堆栈上,是通过做创建的
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
到其中。