2010-10-21 56 views
2

我想序列化向量。我不知道如何改变向量的指针.. 为简单起见,假设我有一个向量是这样的:C++ vector如何更改内部指针

vector<char> v; 

我有这个指针:

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

而且我想我的矢量v的内部指针指向我的char * C:

&v[0] -> c 

如何调整矢量,它会指向C吗?有什么办法可以做到吗?


EDIT 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());

嗯,这是不是也工作,因为我不上我的课,这个矢量,据我understan,未初始化使用new关键字。所以如果我尝试复制,push_back_fill这个载体与smt,它给了我这个错误:

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

这是有道理的...所以任何人都知道我怎么能从外面调用构造函数/初始化矢量?

+0

你的编辑正在做一些我认为很糟糕的事情。什么是myVector? - 但是不管它是一个字符缓冲区还是另一个向量,你都是未知行为。你可能会逃避这个,虽然'vector v(len); memcpy(&v [0],charbuffer,len);' – 2010-10-22 06:57:33

+0

vector myvector ...以及它并不重要,这只是一个例子,而不是实际的代码。任何已知的危险? – MCA 2010-10-22 10:59:14

+0

“我不喜欢这部分”......个人而言,这不是我最不喜欢的部分。 – 2011-01-28 15:56:32

回答

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)); 

这是algorithmcopy通话,然后从iteratorback_inserter函数调用。

+0

我需要这个反向实现..我有一个char *缓冲区,我需要将其分配给向量internap指针... – MCA 2010-10-21 15:04:13

+1

@MCA看到我编辑的响应。您不能将矢量的内部指针重新分配给您自己的指针。您可以让矢量包含您的数组在按上述方式分配时所具有的含义。但是,如果更改数组,矢量将不会更改。 – wheaties 2010-10-21 15:16:53

+0

我试过复制算法,因为我从来没有调用构造函数,矢量是缺少它的内部工作。我在下面发布了另一个答案...如果我可以产生我的矢量,我可以复制内容... – MCA 2010-10-21 15:24:16

0

如果是“内部”,那么probalby不会被篡改!

+0

好..嗯...没关系... – MCA 2010-10-21 15:04:43

3

没有标准的方法来做到这一点。你可以深入到一个给定的实现中,看看如何处理(虽然实际上可能没有办法),但是如果你的库改变或更新了,你的技巧可能会失败。图书馆作者通常不觉得有必要支持这种用途。

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

假设你可以分配给内部指针。这无疑指向免费商店的内存,但它可能并不指向内存的开始,返回值为newmalloc()。内存的大小必须至少足以保持容量乘以元素的大小,但实际上可能会更大。 vector<>可能依赖于其内容是特定池的一部分,或以特定方式分配和释放。分配可能会影响vector<>的其他数据成员,例如可能是指向.end()的指针。在这些情况中的任何一种情况下,如果不知道确切的实现方式,就无法管理内存和变量。

一般来说,干涉实现内部结构是很容易出错的,并且可能会随着对库的任何更改而有可能中断,带有或不带有明显的效果。也不是经常需要,甚至不需要。找到另一种序列化向量的方法。

+0

是啊我找到了你。但我仍然需要解决它。否则,我强迫ppl删除应用程序上的矢量!所以如果我找到一种方法来做到这一点会很好...... – MCA 2010-10-21 15:05:49

0

这会对你有用吗?

vector<char*> v; 
char* c = { 'v', 'e', 'c', 't', 'o', 'r' }; 
v.push_back(c); 
+0

我希望它会......但是内部分配却搞砸了!所以推回不工作... – MCA 2010-10-21 15:38:30

0

如果您使用的另一种载体为你的I/O缓冲区,然后你可以使用std::swap变更内容(将更新指针和任何其他数据是合适的,喜欢的计数的存储位置)。

0

我看到了你自己的答案(btw不应该作为答案发布,它应该已经编辑到问题中)。所以你想用C++做序列化。放弃memcpy并使用适当的序列化工具,例如boost :: serialization。这不是很好,但它是必要的。否则,它将无法正常工作 - C++不能这样工作。

+0

好吧,这是我在这里的第一篇文章,所以我不知道回答我自己的问题或编辑它.. :)我在一个大项目工作,我们有很多代码在这里,所以我不能添加库,或从任何地方移除向量。首先,我需要找到一种工作方式,如果它不起作用,我需要与他人协商讨论使用另一个lib/remove vector /或者以不同的方式完成我的工作......并且我已经想出了一个解决方案..让我们编辑我的prev帖子:) – MCA 2010-10-22 06:29:14