Article last modified on 2002-5-30
----------------------------------------------------------------
The information in this article applies to:
- Microsoft Visual C++, 32-bit Editions, version 6.0, SP5
----------------------------------------------------------------
今天提供四個問題。
STL的Map是如何處理指針的? 比如,我們將一個char*作為key,STL會主動釋放它嗎?或者這么說,我想確定,當一個item被刪除時,我的char*沒有被刪除。是否Map另外復制了一份char*? |
是的,Keys和Values都會被復制一份,然后傳入(所有的容器都是這樣做的)。容器僅僅負責刪除這份copy。 所以當你把一個指針放到Map中時,Map不關心這個指針引用的是什么。Map得到并最終刪除這個指針的copy。 |
下面的這個問題可能屬于初學者容易犯的錯誤。不妨看一看吧。
我有這樣的代碼,是將char*一個一個地放入queue中,然后再將它們彈出來,并打印出來。 void main() { typedef queue<char*> CHARQUEUE; CHARQUEUE q; char s[10]; for (int i=65;i<81;i++) { _strnset(s,i,9); s[9]=´\0´; q.push(s); } for (i=61;i<84;i++) { q.pop(); if(q.size()) cout << q.front()<< endl; } } 但是結果不對,為什么?打印出來的各個元素都是”PPPPPPPPP”? |
原因就是每次循環是都重寫了靜態分配的字符串數組。你應該使用basic_string,它將為你分配和管理字符串資源,而不是自己手工填充這些Buffers。 修改你的代碼如下,也可以(要注意釋放malloc出來的東西): for (int i=65;i<81;i++) |
剩下的兩個問題,都挺簡單的,屬于HowToDo的問題。第一個:
我有一個char* vector,如何用一句話將其內容寫至一個文件中,或者從文件讀至vector,而不是Element By Element地做? |
假設你想一個vector的元素為文件的一行。那么我們可以這么做: #include <string> #include <vector> #include <iterator> #include <fstream> using namespace std; void main() { int VECTOR_SIZE = 10; vector<char*> vecStrings; for (int i = 0; i < VECTOR_SIZE; i++) vecStrings.push_back("Vector Element to File"); ofstream output_file("output_file.txt"); copy(vecStrings.begin(), vecStrings.end(), ostream_iterator<char*>(output_file, "\n")); } 這樣,就產生了一個output_file.txt,其內容為: Vector Element to File Vector Element to File 。。。 但是,將內容讀回來可能有點復雜。Vector<char*>是問題之所在。STL不知道該如何給它分配空間。 如果是vector<string>的話,倒是可以這么做: copy(istream_iterator<string>(in_file), istream_iterator<string>(), back_inserter(vecStrings)); |