我有一个问题,我正在努力,我需要使用某种二维数组.数组是固定宽度(四列),但我需要动态创建额外的行.
为此,我一直在使用向量的向量,我一直在使用一些包含这个的嵌套循环:
array.push_back(vector<float>(4));
array[n][0] = a;
array[n][1] = b;
array[n][2] = c;
array[n][3] = d;
n++
Run Code Online (Sandbox Code Playgroud)
添加行及其内容.问题是我似乎因为我试图创建的元素数量而耗尽内存,所以我减少了我使用的数量.但后来我开始阅读deque,并认为它可以让我使用更多的内存,因为它不必是连续的.在这个循环中,我将所有提到的"vector"改为"deque",以及所有声明.但后来看来我再次耗尽内存,这次即使行数减少也是如此.
我查看了我的代码使用了多少内存,当我使用deque时,内存稳定上升到2GB以上,程序很快关闭,即使使用较少的行数.当内存耗尽时,我不确定它在这个循环中的确切位置.
当我使用向量时,即使循环退出,内存使用(对于相同的行数)仍然低于1GB.然后继续进行类似的循环,添加更多行,仍然只达到约1.4GB.
所以我的问题是.对于deque来说,使用两倍以上的向量内存是正常的,还是我在思考我可以在声明/初始化和上面的代码中用"deque"替换单词"vector"时做出错误的假设?
提前致谢.
我正在使用:MS Visual C++ 2010(32位)Windows 7(64位)
我有以下场景:我有一个单独的线程,应该用一对整数填充一个容器(本质上,任务描述),我有大量的工作线程(8-16),应该从这里获取元素容器并执行一些工作.
我认为这个问题可以通过阻塞队列轻松解决 - 例如,在删除项目时,线程会同步对队列的访问,如果没有可用数据则会休眠.
我(也许是错误的)认为这样的东西应该存在于STL或者boost中,但我无法找到任何东西.
我真的必须自己实施那件事吗?这似乎是一种常见的场景......
我只是发现,与我使用预先分配的数组的"自制"堆栈版本相比,标准的std deque非常慢.
这是我的堆栈代码:
template <class T>
class FastStack
{
public:
T* st;
int allocationSize;
int lastIndex;
public:
FastStack(int stackSize);
FastStack();
~FastStack();
inline void resize(int newSize);
inline void push(T x);
inline void pop();
inline T getAndRemove();
inline T getLast();
inline void clear();
};
template <class T>
FastStack<T>::FastStack()
{
lastIndex = -1;
st = NULL;
}
template <class T>
FastStack<T>::FastStack(int stackSize)
{
st = NULL;
this->allocationSize = stackSize;
st = new T[stackSize];
lastIndex = -1;
}
template <class T>
FastStack<T>::~FastStack()
{
delete …Run Code Online (Sandbox Code Playgroud) 嗨,我需要一个stl容器,它可以像向量一样索引,但不会在内存中移动旧元素,就像向量调整大小或保留一样(除非我在开头调用reserve一次,容量足以容纳所有元素,这是对我不好)(注意我确实解决了对元素的绑定问题,因此我希望这些元素的地址永远不会改变).所以我发现了这个双端队列.你觉得这个目的有用吗?重要提示:我只需要推回,但我需要按需小块增长容器.
如果我们不断在容器的前面和后面添加,则应选择矢量Deques.但是,这是什么?不要vector的和deque的operator[]工作一样,还是没有?如果没有,哪一个更快?
我理解随机访问迭代器如何对连续容器起作用std::vector:迭代器只是维护一个指向当前元素的指针,并且任何加法/减法都应用于指针.
但是,我对于如何为非连续容器实现类似的功能感到困惑.我对如何std::deque:iterator工作的第一个猜测是,它维护了一个指向它包含的连续内存组的表的指针,但我不确定.
典型的标准库如何实现这一点?
来自官方文档:
向左延伸(可迭代)
Run Code Online (Sandbox Code Playgroud)Extend the left side of the deque by appending elements from iterable. Note, the series of left appends results in reversing the order of elements in the iterable argument.
该方法行为背后的原因/概念是什么?我知道我可以通过使用轻松更改它reversed,但我只是好奇。
有没有更好的方法将a的内容复制std::deque到字节数组?似乎STL中应该有一些东西可以做到这一点.
// Generate byte-array to transmit
uint8_t * i2c_message = new uint8_t[_tx.size()];
if ( !i2c_message ) {
errno = ENOMEM;
::perror("ERROR: FirmataI2c::endTransmission - Failed to allocate memory!");
} else {
size_t i = 0;
// Load byte-array
for ( const auto & data_byte : _tx ) {
i2c_message[i++] = data_byte;
}
// Transmit data
_marshaller.sendSysex(firmata::I2C_REQUEST, _tx.size(), i2c_message);
_stream.flush();
delete[] i2c_message;
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找空间或速度或两者的建议......
编辑:应该指出,
_marshaller.sendSysex()不能扔.
跟进:
我认为值得重新考虑所有内容,因为评论非常有启发性(除了火焰战争).:-P
被问到的问题的答案......
使用 std::copy
更大的图景:
不是简单地增加代码的原始性能,而是值得考虑为代码库添加健壮性和长寿.
我忽略了RAII - 资源获取是初始化.通过向另一个方向发展并略微受到性能影响,我可以在弹性方面获得巨大收益(正如@PaulMcKenzie和@WhozCraig所指出的那样).事实上,我甚至可以将我的代码与依赖项中的更改隔离开来!
最终解决方案 …
我有以下双端队列对象:
test = deque([np.zeros((4,1,1))+0.5] * 25)
Run Code Online (Sandbox Code Playgroud)
所以有 25 个某种形状的数组,我将追加对象,在另一端弹出旧的数组,等等。
在某些时候,我想要在双端队列中选择元素的子集:
>>> idx = np.round(np.linspace(0, 20, 4, dtype='int'))
>>> idx
array([ 0, 6, 13, 20])
Run Code Online (Sandbox Code Playgroud)
所以我想要那些索引。我试过:
>>> test[idx]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: only integer scalar arrays can be converted to a scalar index
Run Code Online (Sandbox Code Playgroud)
也许deque不支持这种类型的索引操作。idx如何轻松(高效)地获取from中的元素列表test?
编辑 -
有关我最初目标的更多信息。我有一个 3D numpy 数组列表,即(N, H,W,3)实时地将一个新的 3D 数组移入 的列表中N,即一个新的大小数组(H,W,3)(如队列)移入 N 的列表中。
如果能为所有内容都提供一个 numpy 形状数组就好了(N, H,W,3),但我不知道如何获得高效的队列功能,所以我选择了deque …
我正在学习c++ STL,我注意到虽然std::vectorand std::array(连续存储)支持的大多数功能都标有,但和 其他非连续存储的constexpr情况并非如此。std::deque所以我花了一些时间做了一些研究,我在 2019 年发现了一个提案,Making std::dequeconstexpr,但它的方法std::deque仍然没有实现。constexpr
我的困惑是std::array保证它的元素存储在堆栈上;就像普通的 C 风格数组一样,所以它应该在编译时计算,但std::vector在堆上分配内存,所以如果它在编译时评估,那么 deque 也是如此,对吗?
谢谢!