簡體   English   中英

C ++ STL算法在列表中添加元素

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM