• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 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.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>