2016-03-12 39 views
1

我想知道是否有人快速添加元素到std::list<T*>如果该元素不在其中。在列表中添加元素的C++ STL算法

这是一个通用的功能,我不能使用循环所以这样的事情

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; 
} 

是因为循环的不正常。有没有人有想法?

+2

提示:有一个std算法*查找*的东西。 –

+2

提示:使用'std :: map'。它可以使用链接字段来实现。它不会插入重复项。 –

+2

使用'std :: any_of' – PiotrNycz

回答

3

为什么你有什么“不好”?看起来非常好,我可读(模missing 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; 
} 
+0

找到我在找什么谢谢你!我编辑了vec_名称,抱歉的错误,不能使用循环,因为它是一个条件的练习。 – wayland700

0

如果你可以添加其他成员到类,你可以添加一个索引,如std::unordered_set。该容器存储唯一值列表,并且可以在O(1)复杂度中搜索特定值,这意味着没有执行全循环搜索来检查该值是否已经存在。即使您已经存储了很多值,它也会保持快速。

使用std :: list,使用库函数(如std::find)将避免明确写入循环,但实现将执行循环,并且在已存储大量值(O(n)复杂度)时这会很慢。

+3

不在设定的复杂性将是O(log n)的? – PYA

+0

此外,如果在容器中的元素的顺序是显著? – Barry

+0

我明白了一套已经实施的循环,但肯定我仅限于此列表。感谢您的评论! – wayland700

-1

您可以使用入侵列表而不是std :: list。在这种情况下,列表中的每个元素都保存其节点数据,因此您只需查询该数据即可了解该元素是否已经在列表中。缺点是此列表中的所有元素都必须能够提供此类数据,并且不能放入这样的列表,例如整数或布尔元素。

如果仍然需要std :: list和/或元素可以是任何类型,那么快速查询元素是否已经存在于列表中的唯一方法是使用索引。索引可以存储在单独的std :: unordered_set中以进行快速查找。您可以使用“按原样”索引列表的值或使用任何自定义函数计算索引。