2011-12-07 61 views
2
include <queue> 
using namespace std; 
char msg[1000]; 

現在,我想擁有一個隊列,可以存儲5種這類味精。所以,它是一個包含5個字符數組的5號隊列,每個數組最多可以包含1000個字符。排列字符的隊列

如何啓動隊列?我試過這個,但沒有奏效。

char msg[1000]; 
queue<msg> p; 
+0

什麼不起作用?編譯器錯誤? –

+1

'std :: string'是整潔的。 – AusCBloke

+0

@JoeMcGrath謝謝。我做了'deque QUEUE; while(1){char msg [1000]; msg = newString(); QUEUE.push(MSG); }'。然後我發現隊列中的所有元素都是相同的,因爲它們引用了同樣的東西'msg'。我該如何解決這個問題? –

回答

1

編輯:std :: vector可能是更好的選擇,只是重讀你的問題,看到字符數組的大小。如果您正在使用它來存儲二進制數據,則std::queue< std::vector <char> > msgs可能是您的最佳選擇。

您不能使用變量作爲類型。儘管你可以有一個字符指針隊列。

#include <iostream> 
#include <queue> 

std::queue <char*> msgs; 

int main() 
{ 
    char one[50]="Hello"; 
    msgs.push(one); 
    char two[50]="World\n\n"; 
    msgs.push(two); 

    msgs.push("This works two even though it is a const character array, you should not modify it when you pop it though."); 


    while(!msgs.empty()) 
    { 
     std::cout << msgs.front(); 
     msgs.pop(); 
    } 

return 1; 
} 

你也可以使用std :: string並避免錯誤。如果你使用的是char*,你需要一個函數來向隊列中添加信息,它們不能在堆棧上(即你需要用newmalloc創建它們),比你在處理隊列時必須記得刪除它們。要確定一個人是在全球空間,一個是在堆棧中,還是一個是在新的空間中,將沒有簡單的方法。未處理正確時會導致未定義的行爲或內存泄漏。 std::string可以避免所有這些問題。

#include <iostream> 
#include <queue> 
#include <string> 

std::queue <std::string> msgs; 

int main() 
{ 

    msgs.push("Hello"); 
    msgs.push("World"); 

    while(!msgs.empty()) 
    { 
     std::cout << msgs.front(); 
     msgs.pop(); 
    } 

return 1; 
} 

如果只是5標準的消息,然後const char*將是一個不錯的選擇,但如果他們總是相同的郵件,你應該考慮引用到你想要的消息整數的隊列。這樣你可以將更多的操作與它聯繫起來。但是,你也可以考慮一個對象隊列。

#include <iostream> 
#include <queue> 

std::queue <int> msgs; 

int main() 
{ 

    msgs.push(1); 
    msgs.push(2); 

    while(!msgs.empty()) 
    { 
     switch(msgs.front()) 
     { 
     case 1: 
      std::cout << "Hello"; 
     break; 
     case 2: 
      std::cout << "World"; 
     break; 
     default: 
      std::cout << "Unkown Message"; 
     } 

     msgs.pop(); 
    } 

    return 1; 
} 
+0

非常感謝!它的工作原理 –

+0

謝謝。我做了'deque QUEUE; while(1){char msg [1000]; msg = newString(); QUEUE.push(MSG); }'。然後我發現隊列中的所有元素都是相同的,因爲它們引用了同樣的東西'msg'。我該如何解決這個問題? –

+0

我不知道什麼newString()是,但我認爲消息應該只是我在這種情況下的字符* ...你可以發佈什麼newString做你的問題? –

3
struct msg { 
    char data[1000]; 
}; 
queue<msg> p; 
+1

我起初寫過'typedef char msg [1000];'但Tomalak提到過,這不適用於STL容器。用一個結構體包裝它可以解決這個問題,儘管使用'std :: string'或者'std :: vector'的東西可能會更有效率,這取決於數據的性質。 – smparkes

+3

您可以使用'std :: array '來代替創建結構。基本上做同樣的事情,但也給你方便的功能。 –

+0

感謝您的留言@BenjaminLindley。 TR1/C++ 11的一部分,我沒有及時更新。 – smparkes

2

msg是一個數組,而不是一個類型。由於數組不可複製,所以這不會起作用。爲什麼不是std::queue<std::string>呢?

+0

感謝您的建議,但我不得不使用char *這次 –

+0

@JJLiu:爲什麼?這很愚蠢。 –

0

首先,你需要在你的include語句前加'#'符號。其次,當你聲明隊列時,你把你想要它包含的類型放在尖括號中(在你的情況下是'char *'),而不是像'msg'這樣的變量名。

+0

+1反擊匿名downvoter。據我所知,這個答案沒有錯。 –

+0

謝謝,答案很好 –

+0

@AlfP。Steinbach:我基本上同意,除了「取消」別人的投票權不是你的工作。這真的是一個值得讚賞的「偉大」答案嗎? –