[英]C++ STL algorithms to add element in list
我想知道是否有人可以將元素添加到std::list<T*>
的快速方法(如果該元素尚不在其中)。
這是一個通用函數,我不能使用循環,所以像這樣
template <class T>
bool Class<T>::addElement(const T* element)
{
for (list<T*>::iterator it = list_.begin(); it != list_.end(); it++)
{
if (element == *it)
return false;
}
list_.push_back(element);
return true;
}
由於循環不好。 有人有想法嗎?
為什么會有“不正常”的情況? 對我來說看起來很好並且可讀(模數缺少typename )。
如果您確實不想使用循環,則可以通過使用算法精確執行該循環來實現相同目的: std::find
:
template <class T>
bool Class<T>::addElement(const T* element)
{
if (std::find(list_.begin(), list_.end(), element) != list_.end()) {
return false;
}
list_.push_back(element);
return true;
}
如果可以將其他成員添加到類中,則可以添加索引,例如std::unordered_set
。 該容器存儲一個唯一值列表,並且可以以O(1)復雜度搜索特定值,這意味着該實現不執行完整循環搜索來檢查該值是否已存在。 即使您已經存儲了很多值,它也會保持快速運行。
使用std :: list時,使用諸如std::find
類的庫函數將避免顯式地編寫循環,但是實現將執行該循環,並且在已存儲大量值的情況下這樣做會很慢(O(n)復雜度)
您可以使用侵入式列表而不是std :: list。 在這種情況下,列表中的每個元素都會保留其節點數據,因此您只需查詢該數據即可確定該元素是否已在列表中。 缺點是此列表中的所有元素都必須能夠提供此類數據,並且您不能放入此類列表中,例如,整數或布爾元素。
如果仍然需要std :: list和/或元素可以是任何類型,那么快速查詢列表中元素是否已存在的唯一方法是使用索引。 索引可以存儲在單獨的std :: unordered_set中,以進行快速查找。 您可以“按原樣”使用列表的值作為索引,也可以使用任何自定義函數來計算索引。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.