STL(shipped with VC6) Questions & Answers(四)

發表于:2007-07-01來源:作者:點擊數: 標簽:
VC.STL Newsgroup Good Questions(四) Article last modified on 2002-5-30 ---------------------------------------------------------------- The information in this article applies to: - Microsoft Visual C++, 32-bit Editions, version 6.0, SP5 -

VC.STL Newsgroup Good Questions(四)

Article last modified on 2002-5-30

----------------------------------------------------------------

The information in this article applies to:

-        Microsoft Visual C++, 32-bit Editions, version 6.0, SP5

----------------------------------------------------------------

 

今天提供四個問題。

一.How does STL Map treat pointers?

Question:

STL的Map是如何處理指針的?

比如,我們將一個char*作為key,STL會主動釋放它嗎?或者這么說,我想確定,當一個item被刪除時,我的char*沒有被刪除。是否Map另外復制了一份char*?

 

Answer:

是的,Keys和Values都會被復制一份,然后傳入(所有的容器都是這樣做的)。容器僅僅負責刪除這份copy。

所以當你把一個指針放到Map中時,Map不關心這個指針引用的是什么。Map得到并最終刪除這個指針的copy。

 

下面的這個問題可能屬于初學者容易犯的錯誤。不妨看一看吧。

二.Error in Put char* array into queue

Question:

我有這樣的代碼,是將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”?

 

Answer:

原因就是每次循環是都重寫了靜態分配的字符串數組。你應該使用basic_string,它將為你分配和管理字符串資源,而不是自己手工填充這些Buffers。

修改你的代碼如下,也可以(要注意釋放malloc出來的東西):

for (int i=65;i<81;i++)
 {
    char* s = (char*)malloc(10);
     _strnset(s,i,9);
    s[9]=´\0´;
    q.push(s);
  }

 

 

剩下的兩個問題,都挺簡單的,屬于HowToDo的問題。第一個:

三.如何用一句話讓vector<char*>讀寫文件?

Question:

我有一個char* vector,如何用一句話將其內容寫至一個文件中,或者從文件讀至vector,而不是Element By Element地做?

 

Answer:

假設你想一個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));

 

 

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97