矢量和倾销

时间:2009-01-28 20:15:17

标签: c++ vector dumping

据我所知,矢量保证是连续的,我可以为它写一大块内存并用它发送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也是安全的(我会推回并清除,我可以将其转储进行测试)

5 个答案:

答案 0 :(得分:4)

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

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

相同
v.reserve(numOfElements);

只是这段代码更快。因此,两种情况下的v.size() == 0v.capacity() 在两种情况下都可能与 numOfElements相同(尽管无法保证 )。但是,在第二种情况下,容量至少为numOfElements ,这意味着在向向量推送许多元素之前,不会重新分配内部缓冲区。请注意,在这两种情况下,如果您尝试访问任何元素,则无效 - 因为实际上包含零元素。

除此之外,我还没有在您的代码中发现问题。它是安全的,我会鼓励它,所以使用它而不是原始newmalloc,因为它提供了增加的安全性。但是我不确定你的意思是“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的自动指针吗?

相关问题