据我所知,矢量保证是连续的,我可以为它写一大块内存并用它发送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也是安全的(我会推回并清除,我可以将其转储进行测试)
答案 0 :(得分:4)
v.resize(numOfElements);
v.clear(); //so i wont get numOfElements + len when i push back
好吧,上面的代码片段实际上是分配和创建元素,只是为了再次销毁它们。它实际上与:
相同v.reserve(numOfElements);
只是这段代码更快。因此,两种情况下的v.size() == 0
和v.capacity()
在两种情况下都可能与 numOfElements
相同(尽管无法保证 )。但是,在第二种情况下,容量至少为numOfElements ,这意味着在向向量推送许多元素之前,不会重新分配内部缓冲区。请注意,在这两种情况下,如果您尝试访问任何元素,则无效 - 因为实际上包含零元素。
除此之外,我还没有在您的代码中发现问题。它是安全的,我会鼓励它,所以使用它而不是原始new
或malloc
,因为它提供了增加的安全性。但是我不确定你的意思是“dump v”。
答案 1 :(得分:2)
实际上,std :: vector保证是连续的,以便与C数组布局兼容。但是,您必须意识到向量的许多操作使指向其元素的所有指针无效,因此您最好坚持使用一种类型:避免在向量上混合指针算法和方法调用。
除此之外,完全正确,除了第一行:你想要的是
v.reserve(numOfElements);
将分配足够的地方将numOfElements
存储到矢量中,而
v.resize(numOfElements);
将执行以下操作:
// pseudo-code
if (v.size() < numOfElements)
insert (numOfElements - size) elements default
constructed at the end of the vector
if (v.size() > numOfElements)
erase the last elements so that size = numOfElements
总而言之,在reserve
之后,您确定向量容量优于或等于numOfElements,在resize
之后您确定向量 size 等于numOfElements。
答案 2 :(得分:2)
对于类似这样的事情,我个人会使用类似STLSoft的auto_buffer<>
:
作为免责声明 - 我不使用实际的STLSoft库版本,我已经调整了我自己的模板 - 我从Matthew Wilson(STLSoft作者)的书"Imperfect C++"开始。
当我真正想要一个普通的C数组时,我发现它很有用,但是在运行时它的大小必须是动态的。 auto_buffer<>
比普通的旧数组更安全,但是一旦你构造了它,就不必担心有多少元素存在 - 它总是用你构造它的任何东西,就像一个数组(所以它有点像不如vector<>
复杂 - 这有时是合适的。)
auto_buffer<>
的主要缺点是它不是标准的,它不在Boost中,所以你要么必须将一些STLSoft合并到你的项目中,要么推出你自己的版本。
答案 3 :(得分:0)
是的,您使用char矢量作为读取原始输入的缓冲区。
// dynamically allocates a buffer of 10,000 char as buffer
std::vector<char> data(10000);
fread(&data[0], sizeof(char),data.size(),fp);
我不会用它来直接将任何非POD数据类型读入矢量。
您可以使用矢量作为写入源 但我会非常小心你如何读回来(它可能更容易序列化)。
fwrite(&data[0], sizeof(char),data.size(),fp);
答案 4 :(得分:0)
你用resize替换reserve(),你也可以替换
vector<char> v2
带
vector<Type> v2
这应该可以简化代码。
坦率地说,这是我见过的矢量中最奇怪的用途,但它可能会起作用。你确定你不想使用新的char [size]和某种来自boost的自动指针吗?