簡體   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