[英]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
添加到集合中的順序,那么保留原始順序可能會有些道理。 同樣,如果通常使用集合的方式是受益於它們在內存中是連續的,並且很少添加新項目,那么將數據存儲在vector
比set
更有意義。
但是, 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.