C++ 矢量控制与倾倒

C++ 矢量控制与倾倒,c++,vector,dumping,C++,Vector,Dumping,据我所知,向量保证是连续的,我可以向它写入一块内存,并用它发送fwrite。我需要做的就是确保调用.resize()将其强制为我需要的最小长度,然后我可以将其用作普通字符数组?这个代码正确吗 v.resize(numOfElements); v.clear(); //so i wont get numOfElements + len when i push back vector<char>v2; v2.resize(numOfElements*SizeOfType); while(

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

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], ....)
v.resize(numOfElements);
v、 清除()//所以当我向后推时,我不会得到numOfElements+len
矢量v2;
v2.调整大小(numOfElements*SizeOfType);
而(…)
{
...
v、 推回(x);
}
压缩(&v2[0],len,&v[0],len);
fwrite(&v2[0],…)
注意,我从来没有推回或弹出v2,我只调整它一次大小,并将其用作字符数组。这样安全吗?如果我也甩了v,那也是安全的(我会向后推并清除,我可能甩了它进行测试)

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

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

除此之外,我还没有发现你的代码有问题。它是安全的,我鼓励它使用它,而不是原始的
新的
malloc
,因为它提供了额外的安全性。然而,我不确定你所说的“倾销v”是什么意思

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

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


除此之外,我还没有发现你的代码有问题。它是安全的,我鼓励它使用它,而不是原始的
新的
malloc
,因为它提供了额外的安全性。然而,我不确定你所说的“倾销v”是什么意思

实际上,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
//伪代码
if(v.size()numOfElements)
擦除最后一个元素,使size=numOfElements

总之,在
保留
之后,您可以确定vector容量优于或等于numOfElements,并且在
调整大小
之后,您可以确定vector大小等于numOfElements。

实际上,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
//伪代码
if(v.size()numOfElements)
擦除最后一个元素,使size=numOfElements

总之,在
保留
后,您确定向量容量优于或等于numOfElements,并且在
调整大小
后,您确定向量大小等于numOfElements。

是的,您使用字符向量作为读取原始输入的缓冲区

// dynamically allocates a buffer of 10,000 char as buffer
std::vector<char>   data(10000);

fread(&data[0], sizeof(char),data.size(),fp);

是的,您使用字符向量作为缓冲区来读取原始输入

// dynamically allocates a buffer of 10,000 char as buffer
std::vector<char>   data(10000);

fread(&data[0], sizeof(char),data.size(),fp);
您将reserve()替换为resize,也可以替换

vector<char> v2
向量v2

向量v2
这将稍微简化代码

坦率地说,这是我见过的最奇怪的向量用法,但它可能会起作用。您确定不想使用新的char[size]和boost中的某种自动指针吗?

如果要将reserve()替换为resize,还可以替换

vector<char> v2
向量v2

向量v2
这将稍微简化代码


坦率地说,这是我见过的最奇怪的向量用法,但它可能会起作用。你确定不想使用新的字符[size]和boost中的某种自动指针吗?

对于这种情况,我个人会使用类似STLSoft的
自动缓冲区的类:

作为免责声明——我没有使用实际的STLSoft库版本,我已经修改了我自己的模板,非常类似——我从Matthew Wilson(STLSoft作者)的书开始

当我真的只想要一个普通的旧C数组时,我发现它很有用,但它的大小在运行时必须是动态的<代码>自动_