2

我想序列化向量。而且我不知道如何更改向量的指针。为了简单起见,假设我有一个类似的向量:

vector<char> v;

我有这个指针:

char* c = { 'v', 'e', 'c', 't', 'o', 'r' };

我希望我的向量 v 的内部指针指向我的 char* c:

&v[0] -> c 

如何调整指向 c 的向量?有什么办法吗?


编辑 22.10.2010

所以伙计们,在调试矢量后,我想出了这个解决方案:

vector<char> dump;
memcpy(&myVector, &dump, sizeof(myVector)); // I change contents so it can work
myVector.assign(buf, buf+5); // copy contents into it from buffer (I don't like this part)

为了工作,我需要定义

_ITERATOR_DEBUG_LEVEL=0

因为它最初设置为 2 并且它实际上进行了调试检查(我猜)这也没有在发布模式中定义,对吗?所以这是我现在的解决方法,我想强制 ppl 长期删除向量......那么你们对这个解决方案有什么看法?你看到了什么危险?


我实际上需要通过 memcpy 序列化向量。我想序列化我的整个类(比如拍摄内存快照)并将其写入文件,并在重新加载时从文件中读取并恢复对象,而无需调用其构造函数并使用 new 运算符。

嗯,这个向量容器发生在堆栈内存上,所以 memcpy 无法到达它,因为它唯一关心的是堆......好吧,这段代码现在可能对我有用:

复制(buf,buf + 5 myVvector.begin());

好吧,这也不起作用,因为我没有在我的类上使用 new 关键字,据我所知,这个向量没有被初始化。因此,如果我尝试使用 smt 复制 push_back_fill 这个向量,它会给我这个错误:

newDel.exe 中 0x00ec455b 处的未处理异常:0xC0000005:访问冲突读取位置 0x00654b4c。

这是有道理的......所以有人知道我如何从外部调用向量的构造函数/初始化器吗?

4

6 回答 6

4

如果你有

vector<char> foo;

foo.push_back( 'v' );
foo.push_back( 'e' );
foo.push_back( 'c' );
foo.push_back( 't' );
foo.push_back( 'o' );
foo.push_back( 'r' );

char *c = &foo[0];

这使得指针指向向量内容的第一项。在您尝试调整矢量大小之前,这将保持有效。

编辑:

你可以用这种方式做你想做的事:

copy( c, c+6, back_inserter( myVector ) );

这是来自的copy调用algorithm和来自的back_inserter函数调用iterator

于 2010-10-21T14:36:52.873 回答
3

没有标准的方法可以做到这一点。您可以深入研究给定的实现并查看如何处理它(尽管实际上可能没有办法),但是如果您的库被更改或更新,您的技巧可能会失败。图书馆作者通常不觉得有必要支持这种用途。

vector<>是一个容器类。它不是 C 样式数组的包装器,尽管它在内部维护一个。它的行为和性能由标准指定,但不是它的内部(除了它的内容必须存储在连续的内存中)。图书馆作者利用这种自由来做出他们所能做的最好的实现。

假设您可以分配给内部指针。那毫无疑问从free store指向内存,但它可能不指向内存的开头,从newor的返回值malloc()。内存的大小必须至少足以容纳容量乘以元素大小,但实际上它可能更大。可能依赖于它的vector<>内容是特定池的一部分,或者以特定方式分配和释放。分配可能会影响 的其他数据成员vector<>,例如可能指向 的指针.end()。在任何这些情况下,您都无法在不知道确切实现的情况下自己管理内存和变量。

一般来说,干预实现内部是容易出错的,并且可能会随着库的任何更改而中断,无论是否有立即明显的影响。它通常也不是必要的,甚至是不可取的。找到另一种序列化向量的方法。

于 2010-10-21T14:59:38.887 回答
0

如果您为 I/O 缓冲区使用另一个向量,则可以使用std::swap它来更改内容(它将更新指针和任何其他适当的数据,例如存储计数的位置)。

于 2010-10-21T15:38:57.983 回答
0

如果它是“内部的”,那么很可能不会被篡改!

于 2010-10-21T14:37:34.477 回答
0

我看到了你自己的答案(顺便说一句,它不应该作为答案发布,它应该被编辑到问题中)。所以你想在 C++ 中进行序列化。放弃 memcpy 并使用适当的序列化工具,例如 boost::serialization。这不是很好,但它是必要的。否则,它根本无法工作——C++ 不能那样工作。

于 2010-10-21T16:16:57.517 回答
0

这对你有用吗?

vector<char*> v;
char* c = { 'v', 'e', 'c', 't', 'o', 'r' };  
v.push_back(c);
于 2010-10-21T15:29:51.387 回答