2010-10-21 88 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