标签: deque

有没有办法让deque的内部存储大小为vector :: capacity?

据我所知,deque和vector都为增长留出了一些空间.vector :: capacity()能够获取向量的内部保留空间.Deque在标准中没有这样的成员.有什么方法可以获得这些信息吗?

c++ deque

4
推荐指数
2
解决办法
1988
查看次数

调用erase时STL迭代器失效的问题

STL标准定义当在诸如std :: deque,std :: list等容器上发生擦除时,迭代器无效.

我的问题如下,假设std :: deque中包含的整数列表,以及一对指示std :: deque中元素范围的指示,删除所有偶数元素的正确方法是什么?

到目前为止,我有以下内容,但问题是假设结束在擦除后失效:

#include <cstddef>
#include <deque>

int main()
{
   std::deque<int> deq;
   for (int i = 0; i < 100; deq.push_back(i++));

   // range, 11th to 51st element
   std::pair<std::size_t,std::size_t> r(10,50);

   std::deque<int>::iterator it = deq.begin() + r.first;
   std::deque<int>::iterator end = deq.begin() + r.second;

   while (it != end)
   {
      if (*it % 2 == 0)
      {
         it = deq.erase(it);
      }
      else
        ++it;
   }

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

检查如何实现std :: remove_if,似乎有一个非常昂贵的复制/降档过程正在进行.

  • 没有所有复制/转换,是否有更有效的方法来实现上述目标

  • 一般来说,删除/删除元素比使用序列中的下一个第n个值交换更昂贵(其中n是到目前为止删除/删除的元素数)

注意:答案应该假设序列大小非常大,+ 1mil元素,平均1/3的元素将被删除.

c++ iterator erase deque invalidation

4
推荐指数
2
解决办法
2773
查看次数

尝试使用Win32线程进行异步I/O.

我正在为Windows编写一个串口软件.为了提高性能,我试图将例程转换为使用异步I/O. 我有代码并且运行得相当好,但我是半初学者,我想进一步提高程序的性能.在程序的压力测试期间(即在高波特率下尽可能快地向/从端口突发数据),CPU负载变得非常高.

如果有人在Windows中有异步I/O和多线程的经验,如果你能看一下我的程序,我将不胜感激.我有两个主要问题:

  • 异步I/O是否正确实现?我在网上发现了一些相当可靠的来源,建议您可以将用户数据传递给回调函数,方法是在最后用自己的数据实现自己的OVERLAPPED结构.这似乎工作得很好,但它确实看起来有点"hackish"给我.此外,当我从同步/轮询转换为异步/回调时,程序的性能并没有那么大提高,让我怀疑我做错了什么.

  • 使用STL std :: deque作为FIFO数据缓冲区是否合理?由于当前编写了程序,我只允许在必须处理之前一次接收1个字节的数据.因为我不知道我将收到多少数据,所以可能是无穷无尽的数量.我假设这个1字节一次在必须分配数据时会产生deque线后面的缓慢行为.而且我也不相信deque也是线程安全的(我应该吗?).如果使用STL deque不合理,是否有任何建议可以使用更好的数据类型?基于静态数组的圆环缓冲区?

关于代码的任何其他反馈也是最受欢迎的.


实现了串行例程,以便我有一个名为"Comport"的父类,它处理所有与串行I/O相关的内容.从这个类我继承了另一个名为"ThreadedComport"的类,这是一个多线程版本.

ThreadedComport类(相关部分)

class ThreadedComport : public Comport
{
  private:

    HANDLE        _hthread_port;                 /* thread handle      */
    HANDLE        _hmutex_port;                  /* COM port access    */
    HANDLE        _hmutex_send;                  /* send buffer access */
    HANDLE        _hmutex_rec;                   /* rec buffer access  */

    deque<uint8>  _send_buf;
    deque<uint8>  _rec_buf;
    uint16        _data_sent;
    uint16        _data_received;

    HANDLE        _hevent_kill_thread;
    HANDLE        _hevent_open;
    HANDLE        _hevent_close;
    HANDLE        _hevent_write_done;
    HANDLE        _hevent_read_done;
    HANDLE        _hevent_ext_send;              /* notifies external thread */
    HANDLE        _hevent_ext_receive;           /* notifies external thread */

    typedef struct …
Run Code Online (Sandbox Code Playgroud)

c++ io winapi asynchronous deque

4
推荐指数
1
解决办法
3665
查看次数

在C++ STL中访问deque元素的最佳方法是什么

我有一个双子座:

deque<char> My_Deque;
My_Path.push_front('a');
My_Path.push_front('b');
My_Path.push_front('c');
My_Path.push_front('d');
My_Path.push_front('e');
Run Code Online (Sandbox Code Playgroud)

有这样的方法输出它.

首先:

deque<char>::iterator It;
for ( It = My_Deque.begin(); It != My_Deque.end(); It++ )
    cout << *It <<  " ";
Run Code Online (Sandbox Code Playgroud)

第二:

for (i=0;i<My_Deque.size();i++) {
    cout << My_Deque[i] <<  " ";
}
Run Code Online (Sandbox Code Playgroud)

什么是访问双端队列的元素的最佳途径-通过迭代器或类似这样的:My_Deque[i]?deque <...>元素是一个指向每个元素的指针数组,用于快速访问它的数据,或者以连续的方式提供对它的随机元素的访问(如下图所示)? 在此输入图像描述

c++ stl deque

4
推荐指数
2
解决办法
1万
查看次数

来自*front*的deque.resize()?

你怎么resize一个std::deque前面,而不是回来了?

(是的,当然我可以push_front成千上万次虚拟值,但是有更好/更有效的方法吗?)

c++ deque

4
推荐指数
1
解决办法
718
查看次数

使用std :: deque :: iterator(在C++ STL中)搜索和删除某些元素

我在调用以下代码时遇到问题:

#include<deque>
using namespace std;

deque<int> deq = {0,1,2,3,4,5,6,7,8};

for(auto it = deq.begin(); it != deq.end(); it++){
    if(*it%2 == 0)
        deq.erase(it);
}
Run Code Online (Sandbox Code Playgroud)

这导致了分段错误.在查看问题后,我发现问题在于STL管理deques的迭代器的方式:如果被擦除的元素更接近deque的末尾,用于指向擦除元素的迭代器现在将指向NEXT元素,但不是前一个元素vector::iterator.据我所知,从修改的循环条件it != deq.end(),以it < deq.end()可能可能解决这个问题,但我不知道是否有遍历&在"标准形式"一个双端队列擦除某些元件,使得代码可以是其他容器类型兼容的方式同样.

c++ iterator stl deque

4
推荐指数
2
解决办法
2万
查看次数

为什么使用迭代中的最后一个maxlen项初始化python deque?

我正在学习如何使用双端队列.这是我做的:

>>> d = deque([1,2,3,4,5,6], maxlen=3)
Run Code Online (Sandbox Code Playgroud)

我预计d会包含[1,2,3].但相反,我得到了:

>>> d
deque([4, 5, 6], maxlen=3)
Run Code Online (Sandbox Code Playgroud)

这不是违反直觉吗?

python deque

4
推荐指数
1
解决办法
9444
查看次数

python中的del a [0]会复制整个列表吗?

我试图使用一个简单的列表del a[0]来模仿deque.popleft().只想了解delpython的工作原理.例如:

a = [0,1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)

a在记忆中处于一个连续的空间.在我调用之后del a[0],python会分配新空间并1,2,3,4,5在那里复制,或者它只会给出a一个新地址(与之相同a = a[1:]).

如果它分配新空间,它是否意味着del a[0]O(len(a))操作?

如果del a[0]是相同的a = a[1:],Python会回收从数组中删除的内存空间吗?

python list deque del

4
推荐指数
1
解决办法
171
查看次数

我如何改变VecDeque?

我可以像这样简单地改变常规向量:

extern crate rand;
use rand::Rng;

fn shuffle(coll: &mut Vec<i32>) {
    rand::thread_rng().shuffle(coll);
}
Run Code Online (Sandbox Code Playgroud)

问题是,我的代码现在需要使用std::collections::VecDeque替代,这导致此代码无法编译.

解决这个问题的最简单方法是什么?

shuffle deque rust

4
推荐指数
1
解决办法
877
查看次数

如何从Python的集合库中查看deque模块的源代码?

我尝试使用inspect.getsource(deque),当它在集合中的其他模块上工作时,在deque上运行它会抛出错误"找不到类定义".为什么这只发生在deque上,我怎么能看到它的源代码?

python deque

4
推荐指数
1
解决办法
109
查看次数

标签 统计

deque ×10

c++ ×6

python ×3

iterator ×2

stl ×2

asynchronous ×1

del ×1

erase ×1

invalidation ×1

io ×1

list ×1

rust ×1

shuffle ×1

winapi ×1