繁体   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