问题标签 [stddeque]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
374 浏览

c++ - 使用类的 const 成员使用 std::deque::erase 编译错误

我在这里得到一个编译错误,我不知道代码有什么问题。我正在使用 g++ 4.9.2。

编辑:我知道删除 const 会删除编译错误,但我不知道为什么。无论如何,我需要这个常量。

0 投票
2 回答
4565 浏览

c++ - 在 C++11 中将 std::vector 移动到 std::deque

如果我有std::deque并且std::vector想要将它们组合到std::deque,我可以通过以下方式进行:

我们知道向量的大小,但我们不能std::deque在使用std::deque.insert(...). 那么这是将所有元素移动std::vector到末尾的最快方法std::deque吗?还是我错过了什么?

谢谢你。

0 投票
3 回答
3040 浏览

c++ - 为什么使用 std::stack 或 std::queue?

为什么我要使用 a std::stackor astd::queue而不是 a std::vectoror a std::deque

由于容器适配器只是标准容器的包装器,为什么要使用它们呢?

0 投票
0 回答
509 浏览

c++ - indy TIdtcpserver 缓冲区限制

TIdtcpserver 缓冲区是否有内部大小限制?为什么我使用任何方法,它达到了 65535 的限制?

这些天我遇到了这个 TidTCPSever 的缓冲区问题。我的代码非常基本:预设缓冲区数组的大小,从 InputBuffer 中提取服务器字节,并将缓冲区数组复制到工作区。这是代码

该代码似乎工作正常, readLength 和 s 是相等的。FDataBuffer 似乎接收每个字节。但是,由于 TidTCPSever 达到限制双端队列失败。

错误消息是:访问 volation #0048D893

我不明白:

  • TidTCPSever 和 deque 属于不同的类
  • 双端队列中的结构值看起来不错
  • 缓冲区大小达到 65535 字节时立即发生错误

我使用缓冲区对吗?

0 投票
1 回答
318 浏览

c# - 避免非托管 c++、c++/cli 和 c# 代码之间的 std::deque 迭代器不可取消引用错误

我有一个 VS2015 解决方案,由非托管 c++ 代码(用于执行一些 CPU 密集型模拟计算)、围绕此代码的 c++/cli 包装器和通过 DLL 调用 c++/cli 包装器的 ac# 项目组成。下面的例子是完整代码的简化版,抱歉提前写了这么多代码,但为了完整的了解情况,需要它。

非托管 C++ 代码

哪里utl::tuple_hash是一个散列函数对象std::pair,更一般地,std::tuple实例,定义为:


托管 C++/CLI 包装器

以下是 c++/cli 中围绕类的包装器,diffusion_limited_aggregate在这种情况下,重要的方法是ProcessBatchQueue. 此方法是std::deque iterator not dereferencable error必须发生的地方,因为它是唯一batch_queue可以访问和弹出内容的地方。


C# 代码

最后,我有以下 c# 代码,用于ManagedDLA2DContainer生成聚合并将它们显示在界面上。

该方法GenerateAggregate仅在每次聚合执行时调用一次,它通过按钮处理程序方法调用,因为我Generate在接口上有一个带有OnGenerateButtonClicked事件处理程序函数的方法,该方法调用GenerateAggreate. 两者CallNativeCppAggregateGeneratorsAggregateUpdateListener也不会在代码中的其他任何地方调用。


问题

如托管包装器部分所述,在执行此代码时,我偶尔会遇到运行时断言错误,

std::deque迭代器不可取消引用。

这往往在第一次执行时发生,但它也确实发生在正在进行的聚合生成过程的中间,因此用于生成聚合的启动代码在这里可能不是罪魁祸首。

我该如何解决这个问题?希望这是我的关键部分代码或类似代码中出现一些逻辑错误的简单案例,但我还无法确定确切的问题。

正如评论中所指出的,问题可能是元素不断被添加batch_queue,而 C# 线程调用ProcessBatchQueue正在消耗队列元素,从而可能使batch_queue' 的迭代器无效。是否有可以应用于此用例的典型生产者-消费者设计模式?

编辑:如果反对者可以给出他们的理由,这样我就可以改进这个问题,那就太好了。

0 投票
2 回答
2044 浏览

c++ - 从 std::deque 线程并发调用 emplace_back() 和 operator[]() 是否安全?

来自以下文档的摘录emplace_back()

  • 迭代器有效性

与此容器相关的所有迭代器都无效,但指针和引用仍然有效,引用它们在调用之前引用的相同元素。

  • 数据竞赛

容器被修改。

调用不会访问包含的元素:同时访问或修改它们是安全的(尽管请参阅上面的迭代器有效性)。

以及来自以下文档的摘录operator[]()

  • 数据竞赛

访问容器(const 和非 const 版本都不会修改容器)。

元素n可能被访问或修改。同时访问或修改其他元素是安全的。

那么,鉴于双端队列的某些实例至少有一个元素,通过容器访问它operator[]()并同时调用emplace_back()它确实是线程安全的吗?

我倾向于说是,但无法确定emplace_back()'s 文档中的“访问”是否包括使用operator[]()as:

其中两个函数被同时调用,或者“访问”仅适用于已获取某些引用或指针的元素:

编辑:为了进一步参考,以下是 C++ 14 标准(实际上是2014 年 11 月的工作草案,N4296)关于deque引用和迭代器有效性的插入说明:

  • 23.3.3.4 双端队列修饰符

(...)

  1. 效果:双端队列中间的插入使所有迭代器和对双端队列元素的引用无效。在双端队列的任何一端插入都会使双端队列的所有迭代器无效,但不会影响对双端队列元素的引用的有效性。

(...)

0 投票
2 回答
4534 浏览

c++ - 为什么 std::queue 使用 std::dequeue 作为底层默认容器?

cplusplus.com上阅读,std::queue实现如下:

队列被实现为容器适配器,它们是使用特定容器类的封装对象作为其底层容器的类,提供一组特定的成员函数来访问其元素。元素被推入特定容器的“后部”并从其“前部”弹出。

底层容器可能是标准容器类模板之一或其他一些专门设计的容器类。该底层容器应至少支持以下操作:

……

标准容器类dequelist满足这些要求。默认情况下,如果没有为特定队列类实例指定容器类,则使用标准容器双端队列

我很困惑为什么在这里使用deque(类固醇上的双端队列)作为默认值,而不是list(这是一个双向链表)。

在我看来这std::deque太过分了:它是一个双端队列,但也具有恒定时间元素访问和许多其他特性;基本上是一个功能齐全的 std::vector 条,“元素连续存储在内存中”保证。

由于正常情况std::queue下只有很少的可能操作,在我看来双向链表应该更有效率,因为内部需要进行的管道更少。


那么为什么std::queue使用std::deque默认实现,而不是std::list

0 投票
1 回答
1637 浏览

objective-c - 如何在 Objective C 中实现循环缓冲区以获得高性能

我们希望每秒多次向 Objective C 中的循环缓冲区添加一个双精度数组。

我们目前正在使用嵌套在另一个 NSMutableArray(二维数组)中的 NSMutableArray。这工作正常,但对我们的需求来说太慢了。

我们希望每秒多次添加到循环缓冲区。当我们这样做并进行性能监控时,我们会看到对 removeObjectAtIndex:0 的调用成为瓶颈(移位 n-1 个对象或 O(n-1))。这是因为我们的循环缓冲区中有数千个条目。

我们已经研究过可能使用 STL 和 std::deque。我们还查看了 CHDataStructures。如您所知,STL 在 C++ 中,可以集成,但不如 Objective C 解决方案那么简单。CHDataStructures 已经过时并且不符合 ARC。

如果可能的话,请建议我们应该如何使用代码示例实现一个循环缓冲区(对于我们的双精度数组)以获得高性能。

0 投票
0 回答
322 浏览

c++ - 从 std::deque 复制到推力 device_vector

我正在尝试制作一个示例代码,我从 a 复制std::deque到 athrust::device_vector但编译器警告calling a __host__ function from a __host__ __device__ function is not allowed(我试图在这里复制粘贴整个错误,但它超出了问题中的字符限制)。如果需要,我可以发布更多详细信息。

代码编译成功,但我真的对这些错误感到恼火,因为它们不会发生在其他 stl 容器std::liststd::vector. 我想知道它们为什么会发生以及如何解决这些警告。

结果如下nvcc --version

这是我的示例代码

这是我用来编译的命令:

提前致谢

0 投票
2 回答
330 浏览

c++ - 具有恒定复杂度的双端队列交换函数的实现

据说 std::deque 交换函数需要恒定的时间,而不是线性的。 http://www.cplusplus.com/reference/deque/deque/swap-free/。那么该功能是如何实现的呢?