c++ - vector 和倾销

标签 c++ vector

据我所知,一个 vector 保证是连续的,我可以向它写入一大块内存并用它发送 fwrite。我需要做的就是确保我调用 .resize() 强制它成为我需要的最小长度然后我可以将它用作普通的 char 数组?这段代码是否正确

v.resize(numOfElements);
v.clear(); //so i wont get numOfElements + len when i push back
vector<char>v2;
v2.resize(numOfElements*SizeOfType);
while(...)
{
...
v.push_bacK(x); 
}
compress(&v2[0], len, &v[0], len);
fwrite(&v2[0], ....)

请注意,我从不退回或弹出 v2,我只调整了一次大小并将其用作 char 数组。这样安全吗?如果我也转储 v 那也是安全的(我确实推回并清除,我可能会转储它进行测试)

最佳答案

v.resize(numOfElements);
v.clear(); //so i wont get numOfElements + len when i push back

好吧,上面的代码片段实际上是在分配和创建元素,只是为了再次销毁它们。它实际上与以下内容相同:

v.reserve(numOfElements);

只是这段代码要快得多。因此,在这两种情况下,v.size() == 0v.capacity() 可能与 numOfElements 在这两种情况下也是如此(尽管这不能保证)。然而,在第二种情况下,容量至少为 numOfElements,这意味着内部缓冲区将不会重新分配,直到您将那么多元素 push_back 到 vector 中。请注意,在这两种情况下,如果您尝试访问任何元素,它都是无效 - 因为实际上包含零个元素。

除此之外,我没有发现您的代码有任何问题。它是安全的,我会鼓励它,所以使用它而不是原始的 newmalloc 因为它提供了额外的安全性。但是,我不确定“转储 v”是什么意思。

关于c++ - vector 和倾销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/489123/

相关文章:

c++ - 在多 GPU 上启动异步内存复制操作

c++ - 线程完成后从 vector 中移除线程

c++ - 如何在 boost.interprocess 共享内存中使用复杂结构的 "push_back"函数 vector

c++ - 使用 std::vector::erase 和 const_iterators

c++ - 链接类构造函数时的范围问题

c++ - OpenCV - 不支持的格式或格式组合错误

java - 最小化累积浮点算术误差

c++ - VS2012 中不允许使用 {...} 进行 vector <字符串> 初始化?

c++ - 复制到system32后文件会改变

C++ : Double free or corruption (out)