2010-03-17 15 views
1

我有一個std ::地圖:傳遞字符串字面量爲std ::地圖::找到(..)

std::map<std::string, std::string> 

我傳遞字符串字面找到方法。很顯然,我可以通過一個字符串,如

.find("blah"); 

不過,我想聲明它的前期,而不是硬編碼字符串,所以我有兩個選擇現在:

const std::string mystring = "blah"; 
const char mystring[] = "blah"; 
static const char * mystring = "blah"; 

他們所有的工作。 (或至少編譯)。我的問題是,我應該使用哪一個?對方的優勢/劣勢是什麼?

+1

你怎麼聲明你的地圖? – Bill

+5

他們都很好,除了我會去第一個:'const std :: string mystring =「blah」;'。這是一個主觀選擇。 – AraK

回答

2

優勢和disadvantatges:

const std::string mystring = "blah";

這是非常標準的C++的方式來處理字符串。你可以做任何你需要用字符串做這件事。主要缺點是速度較慢。那裏有一個動態分配。另外,如果.find在場景下依賴於char[],那麼您正在浪費所有堆的工作,甚至可能需要在內部獲取c可用數組。

const char mystring[] = "blah";

此分配堆棧上的5個字節的字符串,所以它是很好,速度很快。缺點是,如果.find使用std :: string,它將不得不做這個分配,並且它會在每次調用時執行它,而不是在這裏執行一次。另外,如果你需要做任何事情(例如:鏈接「.txt」),使用std :: string會更容易。

static const char * mystring = "blah";

如果這是外部範圍,這意味着它保持本地的源文件。儘管如此,C++的方式是使用未命名的命名空間而不是static。這樣做的唯一好處是它與C兼容(或者至少有足夠新的編譯器知道「const」是什麼)。

通常,我會去與std :: string。除特殊情況或極端情況外,易用性勝過速度。

+0

它是一個映射:std :: map ,仍然不確定,它是否轉換爲char [] – ra170

+1

如果你不知道,我可能會用std ::串。 –

2

(這是假設你mapkey_typestd::string

我會提供一個選項去,你沒有指定:

static const std::string mystring("blah"); 

這樣的字符串是兩個只讀和初始化只有一次。

0

我寧願

const char * const mystring = "blah"; 
6

假設你的地圖由std::string(我認爲這必須是所有三種選擇編譯)鍵,那麼首先是更有效的。您將創建一個單一的字符串對象,並通過引用將其傳遞給每個對find的調用。其他人將爲每個find創建一個臨時字符串對象。