繁体   English   中英

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

[英]C++ standard template library vector question

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

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

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

编辑:凭心而论,我想我要补充一点, 还有可能想要做这样的事情的几个原因。 例如,如果您确实需要知道将Cat添加到集合中的顺序,那么保留原始顺序可能会有些道理。 同样,如果通常使用集合的方式是受益于它们在内存中是连续的,并且很少添加新项目,那么将数据存储在vectorset更有意义。

但是, set目的是完全执行此处要做的事情,因此set是显而易见的选择(没有明显的理由使用在显示的内容中不可见的vector )。

如果媒介cats还没有的话,它将在媒介cats添加一个名为morris的物品!

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

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

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

这会在cats(cats.begin()到cats.end())的整个范围内搜索等于morris的对象(指向cat的指针)

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

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

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

测试猫是否包含该对象(莫里斯)。 如果没有,它将执行以下命令:

cats.push_back(morris);

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

首先要小心:您的评论是错误的。 cat不是Cat对象的向量,而是POINTERS对cat对象的向量。

现在,声明:

std :: find(cats.begin(),cats.end(),莫里斯)

表示您在某处有莫里斯猫*。 该语句将在两个提供的迭代器(即cats.begin()和cats.end())之间搜索向量,以寻找指向Cat的指针,该指针等于morris(相同的地址)。 如果未找到,则std :: find返回第二个迭代器,因此,在您的情况下为“ cats.end()”

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

如果我们不知道到底是什么困扰着我,我会很难说清楚

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

你说错了。 cats是指向Cat类的指针的std::vector 区别在于: 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);
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM