我是一个来自C++/STL的相对较新的Java程序员,我正在寻找具有这些特性的类(C++ std :: deque具有,据我所知):
是否有Java等同于此?我找到了Java 1.6 [ArrayDeque]类,它具有插入/删除和可增长的特性,但似乎没有按索引查找,除非你调用toArray(),它不是O(1).
我正在移植使用大量浮点数的代码,这可能会触发从c到c ++的malloc失败.我问了一个关于我是否应该使用矢量或deques的问题,Niki Yoshiuchi慷慨地给了我一个安全包装类型的例子:
template<typename T>
class VectorDeque
{
private:
enum TYPE { NONE, DEQUE, VECTOR };
std::deque<T> m_d;
std::vector<T> m_v;
TYPE m_type;
...
public:
void resize(size_t n)
{
switch(m_type)
{
case NONE:
try
{
m_v.resize(n);
m_type = VECTOR;
}
catch(std::bad_alloc &ba)
{
m_d.resize(n);
m_type = DEQUE;
}
break;
}
}
};
Run Code Online (Sandbox Code Playgroud)
我需要一个2D矢量/ deque deques的矢量,所以我将其修改为以下代码:
template<typename T>
class VectorDeque
{
private:
enum STORAGE_CONTAINER { NONE, DEQUE, VECTOR };
std::deque<std::deque<T> > x_d,y_d,z_d;
std::vector<std::vector<T> > x_v,y_v,z_v;
TYPE my_container;
public:
void resize(size_t …Run Code Online (Sandbox Code Playgroud) 我猜它不是,我只想确定.意思是2个线程使用相同的 std :: deque std::deque::push_back或push_front同时使用.
同样的问题std::priority_queue和功能std::priority_queue::push和std::priority_queue::pop..
这些容器是否是线程安全的?或者我应该亲自编程它是线程安全的?
Tnx很多.
我无法确定以下双端队列是否是线程安全的.
简而言之,我创建了一个带有双端队列的类,它在新线程中每1秒显示一次其内容(因此在打印时不会暂停主程序).
deque是从主线程填充的,所以基本上应该有碰撞的机会.
但是,使用类方法填充deque,因此实际上它是从实例本身访问的,因此来自同一个线程.
这是简化的代码:
import threading
import time
from collections import deque
class MyQueue(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.q = deque()
self.start()
def run(self):
# pop out queue items every 1 sec
# (please ignore empty deque for now)
while True:
print self.q.popleft()
time.sleep(1)
def add_to_q(self, val):
# this function is called from outside
self.q.append(val)
# main
# fill the queue with values
qu = MyQueue()
for i in range(1:100):
qu.add_to_q(i)
Run Code Online (Sandbox Code Playgroud)
因此,虽然在实例中添加和删除队列中的项目,但是由于从实例外部调用添加函数,是否存在风险?
编辑:
因为我需要修改我的双端队列中的项目,所以我不得不使用Deque.我所做的是:roatate()到给定的项目,弹出它,修改,推回它并旋转()它回到它原来的位置.
除非我找到一种在队列中实现修改项目的方法,否则我将不得不坚持使用Deque
我在Python中有一个deque,我正在迭代.有时候,当我正在进行交互时,deque会发生变化RuntimeError: deque mutated during iteration.
如果这是一个Python列表而不是一个双端队列,我只是迭代一个列表的副本(通过一个切片my_list[:],但由于切片操作不能用于deques,我想知道什么是最pythonic处理这个的方法是?
我的解决方案是导入复制模块,然后迭代一个副本,这样for item in copy(my_deque):很好,但因为我搜索了这个主题的高低,我想我会在这里发帖询问?
C++ 标准 (N4901) 参考 deque push_front 函数进行了这样的说明:
\n\n\n实现应为 \xe2\x80\x9ccontainer\xe2\x80\x9d 列中显示的所有容器类型提供这些操作,并应实现它们以便采用摊余常数时间。
\n
如果我没有记错的话,这意味着符合标准的实现应该提供一个需要摊销 O(1) 时间的双端队列 push_front 函数。
\n然而,在查看了源代码并在 gdb 下运行了一些测试程序之后,我开始相信 deque push_front 函数的 libc++ 实现实际上具有 O(log n) 摊销时间。
\n对于上下文:STL 双端队列是使用两级数组在 libc++ 中实现的,它map是一个动态数组,其中包含指向名为 的固定大小数组的指针blocks。只有一个map,其大小不受限制,并且有无数个blocks,其大小是固定的。
这是一个准确的可视化(为了证明,见下文),显示了map每个新的外观block(blocks按分配顺序命名,因此 b01 是第一个block分配的,b02 是第二个block分配的,依此类推)是map通过调用添加到push_front. 线性时间操作,例如map通过复制或移动整个数组memmove标记为:
[]\n[b01]\n[b02, b01] copied\n[b03, b02, b01, ___] copied\n[b04, b03, b02, b01] …Run Code Online (Sandbox Code Playgroud) 我一直在寻找持久的实时可连接deques的工作.有各种方法具有用于连接deques的对数复杂性,有些方法具有摊销的常数时间实施,但实时(非摊销)具有恒定时间连接的deques少得多.
众所周知的实时可连接deque是1999年由Haim Kaplan和Robert Tarjan撰写的文章,Purely Functional,Real-Time Deques with Catenation.然而,关于deques 的维基百科页面和这个梦幻般的StackOverflow答案都提到了Robert Tarjan和Radu Mihaescu最近的工作(显然是2003年),这应该更简单.
有没有人链接到Robert Tarjan和Mihaescu关于这项工作的出版物?我在浏览网页时唯一能找到的就是一个.doc文档,显然是某些课程笔记的一部分,而且这种格式既不舒服,也不够可靠,无法实现.
有些网页将第二作者称为"Mihaesau",这似乎是一个错误.我找到了一个DBLP的出版物列表,更近期,没有提及可连接的队列,以及一个微薄的网页,没有链接到出版物部分.
我正在运行许多线程并在队列中收集结果.我想将其转储到数组或列表中,以便我可以进行索引并检索这些结果.队列中的每个元素都是维度为n的数组.我想访问这些数组.请你告诉我,我怎么办?
def dump_queue(model_queue):
queue_list = []
for i in iter(model_queue.get,'STOP'):
queue_list.append(i)
return queue_list
aux_model=train_svm(np.array(trainExample),np.array(trainLabel))
model_queue.put(aux_model.coef_)
Run Code Online (Sandbox Code Playgroud)
因此,数组是学习的模型参数svm.model_queue在线程之间共享.我想访问每个模型参数向量而不是模型参数的每个条目.
在snapdragon设备上运行我们的android应用程序时遇到了一些奇怪的崩溃,但在其他设备上运行良好.以下是进程死前的一些日志:
W/Adreno-EGLSUB( 3075): <DequeueBuffer:583>: dequeue native buffer fail: Unknown error 2147483646, buffer=0x0, handle=0x0
W/Adreno-EGLSUB( 3075): <SwapBuffers:1300>: Invalid native buffer. Failed to queueBuffer
W/Adreno-EGLSUB( 3075): <updater_thread:456>: native buffer is NULL
D/QCUtilClass( 2464): extended extractor not needed, return default.
Run Code Online (Sandbox Code Playgroud)
和:
E/BufferQueue( 357): [xxx.xxxx.xxxxx(our game app)] dequeueBuffer: can't dequeue multiple buffers without setting the buffer count
W/Adreno-EGLSUB( 3075): <DequeueBuffer:583>: dequeue native buffer fail: Invalid argument, buffer=0x0, handle=0x0
W/Adreno-ES20( 3075): <gl2_surface_swap:43>: GL_OUT_OF_MEMORY
W/Adreno-EGL( 3075): <qeglDrvAPI_eglSwapBuffers:3590>: EGL_BAD_SURFACE
Run Code Online (Sandbox Code Playgroud)
.....
任何帮助将不胜感激.谢谢.