1

据我所知,向量保证是连续的,我可以向它写入一大块内存并用它发送 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 那也是安全的(我确实推回并清除,我可能会倾倒它进行测试)

4

5 回答 5

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因为它提供了额外的安全性。但是,我不确定您所说的“转储 v”是什么意思。

于 2009-01-28T20:22:57.313 回答
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

总而言之,在 a 之后,reserve您确定向量容量优于或等于 numOfElements,在 a 之后,resize您确定向量大小等于 numOfElements。

于 2009-01-28T20:31:45.390 回答
2

对于这样的事情,我个人会使用像 STLSoft's 这样的类auto_buffer<>

作为免责声明 - 我不使用实际的 STLSoft 库版本,我改编了自己的非常相似的模板 - 我从 Matthew Wilson(STLSoft 作者)的书“不完美的 C++”开始。

当我真的只想要一个普通的 C 数组时,我发现它很有用,但大小在运行时必须是动态的。auto_buffer<>比普通的旧数组更安全,但是一旦你构建了它,你就不用担心有多少元素 - 它总是你用什么来构建它,就像一个数组一样(所以它比vector<>- which有时是合适的)。

主要的缺点auto_buffer<>是它不是标准的并且不在 Boost 中,因此您必须将一些 STLSoft 合并到您的项目中或推出您自己的版本。

于 2009-01-28T21:08:27.657 回答
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);
于 2009-01-28T20:42:08.677 回答
0

你用resize替换reserve(),你也可以替换

vector<char> v2

vector<Type> v2

这应该会稍微简化代码。

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

于 2009-01-28T20:42:38.723 回答