0

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

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);
}
4

6 回答 6

5

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

我会稍微解释一下。用简单的英语来说,这是一种非常简单的方法:

 std::set<Cat> cats;

 cats.insert(morris);

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

编辑:公平地说,我想我应该补充一点,你可能想做这样的事情几个原因。例如,如果您确实需要知道s 添加到集合中的顺序,那么保留原始顺序可能会有意义。同样,如果您通常以一种受益于它们在内存中连续的方式使用集合,并且很少添加新项目,那么将数据存储在 a 中可能比a 更有意义。Catvectorset

但是, Aset旨在完全执行此处正在执行的操作,因此 aset是显而易见的选择(没有令人信服的理由来使用 avector在您所显示的内容中不可见)。

于 2011-03-03T19:20:06.110 回答
2

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

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

于 2011-03-03T19:18:40.717 回答
1

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);

它将对象(莫里斯)放入向量中。

于 2011-03-03T19:20:07.517 回答
1

首先要小心:您的评论是错误的。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 '还没有在猫向量中,把它放在最后"

如果我们不知道到底是什么困扰着您,我将很难说得更具体

于 2011-03-03T19:22:37.910 回答
1

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

于 2011-03-03T19:16:35.553 回答
0
std::vector<Cat*> cats; //I get that cats is a vector of Cat objects

你弄错了。cats是一个std::vector指向类的指针Cat。有一个区别:Cats 驻留在堆栈上,是通过做创建的

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到其中。

于 2011-03-03T19:23:15.383 回答