c++ - std::forward_list 和序列概念要求

标签 c++ c++11

标准委员会选择为 std::forward_list 实现 API 是否有某种原因使其满足序列 容器概念要求?

Sequence 概念要求指定容器必须与以下表达式兼容:

c.insert(it, v);    // insert at position
c.insert(it, n, v); // fill insert
c.insert(it, begin, end);  // insert range

... 其中it是一个迭代器,v是一个元素,n是一个整数,begin/end 是一个迭代器范围。

这个 API 没有理由不能用于单链表,因为 insert 函数需要一个迭代器起始位置。但出于某种原因,std::forward_list 具有 insert_after 函数,这破坏了与 Sequence 概念的兼容性。

这有什么原因吗?

最佳答案

原因是在单向链表中before插入一个元素是非常低效的:你必须从头开始迭代,直到找到请求插入的位置,使插入 O(n)而不是常数时间。

比较为什么他们不在 operator[] 中提供 std::list 因为这需要线性时间。正如list相比于vector不满足随机访问的要求一样,forward_list相比于list也不满足所有的序列要求。

关于c++ - std::forward_list 和序列概念要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28372625/

相关文章:

c++ - 在嵌套模板结构中将引用类型作为模板参数传递不起作用

c++ - 是否可以在 C++ 中创建类型声明数组?

c++ - 初始化列表中的隐式转换失败

c++ - STL 静态常量成员定义

c++ - 如何重新专门化模板?

c++ - 未指定 lambda 函数的返回类型时出现段错误

c++ - 我应该使用 shared_ptr 还是 unique_ptr?

c++ - c++中双指针数组的默认初始化?

c++ - C++11 中有什么好的新方法可以将其他 "cloned"的 "hierarchy-classes"对象存储为成员?

c++ - decltype 和 auto 之间的等价性