相关疑难解决方法(0)

什么是STL的双端队列?

我正在查看STL容器并试图弄清楚它们到底是什么(即使用的数据结构),并且deque阻止了我:我起初认为它是一个双链表,它允许从两端插入和删除恒定时间,但我对运营商[]在恒定时间内做出的承诺感到不安.在链表中,任意访问应该是O(n),对吗?

如果它是一个动态数组,它如何在恒定时间内添加元素?应该提到的是,可能会发生重新分配,并且O(1)是一个摊销成本,就像向量一样.

所以我想知道这个结构允许在恒定时间内任意访问,同时永远不需要移动到一个新的更大的地方.

c++ stl deque

173
推荐指数
7
解决办法
6万
查看次数

连续迭代器检测

C++ 17引入了ContiguousIterator的概念http://en.cppreference.com/w/cpp/iterator.然而,似乎没有计划contiguous_iterator_tag(通过我们现在以同样的方式random_access_iterator_tag)报告std::iterator_traits<It>::iterator_category.

为什么contiguous_iterator_tag失踪?

是否有传统的协议来确定迭代器是否是连续的?还是编译时间测试?

在过去我提到过,对于容器,如果有一个.data()成员转换为指向::value类型的指针,并且有.size()成员可转换为指针差异,那么应该假设容器是连续的,但我不能提取迭代器的类似特征.

一种解决方案可能是data为连续迭代器提供一个函数.

当然,连续概念&(it[n]) == (&(*it)) + n在所有情况下都有效n,但在编译时无法检查.


编辑:我发现这个视频把它放在更广泛的C++概念上下文中.CppCon 2016:"在现代多核世界中构建和扩展迭代器层次结构",作者:Patrick Niedzielski.解决方案使用概念(Lite),但最后的想法是连续的迭代器应该实现一个pointer_from函数(与我的data(...)函数相同).

结论是概念将有助于形式化理论,但它们并不神奇,在某种意义上,某个人会在某个地方定义新的特别命名的函数而不是连续的迭代器.这个讨论概括了分段迭代器(带有相应的函数segmentlocal),不幸的是它没有说明跨步指针.

c++ iterator iterator-traits c++17

27
推荐指数
1
解决办法
1826
查看次数

标签 统计

c++ ×2

c++17 ×1

deque ×1

iterator ×1

iterator-traits ×1

stl ×1