Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用std::vector缓冲区的高效输入处理_C++_Vector - Fatal编程技术网

C++ 使用std::vector缓冲区的高效输入处理

C++ 使用std::vector缓冲区的高效输入处理,c++,vector,C++,Vector,我试图找到一种快速输入的方法,但我了解到使用STL进行输入可能会很慢 我有一个回调,每当我得到键盘输入时就会触发。 它用(int\u键,int\u状态,int\u生命)创建一个对象 每次我收到这个回调,我将对象推回到我的std::vector 每一帧,我检查这个向量的顶部,并删除“死”输入 该向量可以被轮询,以查找在该时刻有效的任何输入,这意味着它将被频繁搜索 优化: -所有的内存都应该是连续的,所以虽然链接列表更适合动态分配,但我应该坚持使用STL的向量吗?我总是从顶部添加,从底部删除,所以我

我试图找到一种快速输入的方法,但我了解到使用STL进行输入可能会很慢

我有一个回调,每当我得到键盘输入时就会触发。 它用
(int\u键,int\u状态,int\u生命)创建一个对象

每次我收到这个回调,我
将对象推回到我的std::vector

每一帧,我检查这个向量的顶部,并删除“死”输入

该向量可以被轮询,以查找在该时刻有效的任何输入,这意味着它将被频繁搜索

优化:

-所有的内存都应该是连续的,所以虽然链接列表更适合动态分配,但我应该坚持使用STL的向量吗?我总是从顶部添加,从底部删除,所以我应该使用什么数据结构

-我在考虑使用一个缓冲区(第二个向量),该缓冲区连续接收来自回调的新输入,然后每个帧将该向量的数据复制到活动输入向量的顶部。由于活动向量将被轮询,这是否会提高性能,因为它不会在循环期间浪费时间添加到活动向量中


基本上,我正试图从这个向量中挤出尽可能多的性能,我需要一些帮助。

听起来你想要一个
std::deque
。邻接元素几乎总是在内存中连续分配,并且在开始和结束时具有恒定的插入和删除时间。

听起来像是您想要一个
std::deque
。邻接元素几乎总是在内存中连续分配,并且在开始和结束时具有恒定的插入和删除时间。

简短回答:这不重要。std::vector和std::list可以轻松处理每秒数百万次的插入操作,但大多数打字员在键盘上的输入速度不会超过每秒10个字符

长答案:如果向量很小(<100),那么在向量上推回和擦除通常非常便宜,并且存储在向量上的对象的复制/交换操作也很便宜。用于插入std:列表或从中删除的分配通常更昂贵。如果成为问题,请衡量成本


std::deque也有分配,根据实现情况,它可能比您的情况下的向量更昂贵,如果我的假设是,您的向量很少包含超过10个项目(所有这些项目都很容易复制)是正确的话。

简短回答:没关系。std::vector和std::list可以轻松处理每秒数百万次的插入操作,但大多数打字员在键盘上的输入速度不会超过每秒10个字符

长答案:如果向量很小(<100),那么在向量上推回和擦除通常非常便宜,并且存储在向量上的对象的复制/交换操作也很便宜。用于插入std:列表或从中删除的分配通常更昂贵。如果成为问题,请衡量成本


std::deque也有分配,并且根据实现情况,可能比您的情况下的向量更昂贵,如果我的假设是,您的向量很少包含超过10个项目(所有这些项目都很容易复制)是正确的。

std::deque
是最好的容器。它保证了O(1)pop_front和push_back(),并具有随机访问和良好的缓存行为(尽管不是完全)

但是,如果您必须具有完全的连续性,那么您需要查看一个定制的循环缓冲容器(Boost IIRC中有一个),因为
向量上的pop_front()相当昂贵


编辑:正如另一张海报所指出的,键盘输入是如此的罕见,即使对于一个非常快的打字员来说,我也很难相信这是您系统中的瓶颈。

std::deque
是最好的容器。它保证了O(1)pop_front和push_back(),并具有随机访问和良好的缓存行为(尽管不是完全)

但是,如果您必须具有完全的连续性,那么您需要查看一个定制的循环缓冲容器(Boost IIRC中有一个),因为
向量上的pop_front()相当昂贵


编辑:正如另一张海报所指出的,键盘输入是如此罕见,即使对于一个打字速度非常快的打字员来说,我也很难相信这是您系统中的瓶颈。

您描述的是,在一端添加数据,在另一端删除数据,这是对队列的典型描述。这是通过类在标准库中实现的

此队列类是所谓的容器适配器,这意味着它使用另一个容器作为实际存储。默认情况下,它使用,但该容器不将其数据保存在连续的内存区域中。但是,您可以使用几乎任何其他标准容器声明
std::queue
,例如
std::vector
(这是唯一保证在连续内存区域中存储数据的容器):

std::使用_向量将我的_队列_排队;
my_queue_与_vector.push(1);
my_queue_与_vector.push(2);
my_queue_与_vector.push(3);
而(!my_queue_with_vector.empty())
{

std::cout您所描述的,在一端添加数据,在另一端删除数据,是队列的典型描述。这是在标准库中用类实现的

此队列类是一个所谓的容器适配器,这意味着它使用另一个容器作为实际存储。默认情况下,它使用另一个容器,但该容器不会将其数据保留在连续的内存区域中。但是,您可以使用几乎任何其他标准容器声明
std::queue
,如
std::vector
(这是唯一保证在连续内存区域中存储数据的容器):

std::使用_向量将我的_队列_排队;
my_queue_与_vector.push(1);
my_queue_与_vector.push(2);
my_queue_与_vector.push(3);
而(!my_queue_with_vector.empty())
{

如果你的内存必须是连续的,t
std::queue<int, std::vector> my_queue_with_vector;
my_queue_with_vector.push(1);
my_queue_with_vector.push(2);
my_queue_with_vector.push(3);

while (!my_queue_with_vector.empty())
{
    std::cout << my_queue_with_vector.top() << '\n';
    my_queue_with_vector.pop();  // Remove top element in the queue
}