2011-06-18 70 views
0

我有以下的C++方法:幫助解釋一個C++方法

typedef unsigned long p3tOffsetType; 
p3tOffsetType buildString(std::string string) 
{ 
    for (stringMap::const_iterator string_iterator = strings.begin(); string_iterator != strings.end(); ++string_iterator) 
    { 
     if (string_iterator->second == string) 
      return string_iterator->first; 
    } 
    p3tOffsetType new_string_offset = string_offset; 
    strings[string_offset] = string; 
    string_offset += string.size() + 1; 

    return new_string_offset; 
} 

什麼功能呢?如果需要,我可以提供更多的代碼。 該代碼是來自在源P3TBuilder(版本2.7)中找到的P3T文件打包程序的代碼片段。

我需要知道這一點,因爲我想

回答

1

假設stringsmap<p3tOffsetType, std::string>string_offset被初始化爲零,似乎做到以下幾點:試想一下,你調用方法幾次帶,例如"Hello","Hi""Hey",並且您將所有這些字符串視爲C字符串並將它們存儲在同一個char數組中。數組元素將是{'H', 'e', 'l', 'l', 'o', '\0', 'H', 'i', '\0', 'H', 'e', 'y', '\0'}。三個字符串的起始索引分別是0,6和9。該方法所做的是創建一個將這些起始索引映射到字符串的映射,所以strings[0] == "Hello"strings[6] == "Hi"strings[9] == "Hey"。此外,它消除了重複,因此再次調用方法"Hello"將使地圖保持不變。

+2

「假設'p3tOffsetType'是一些整數類型[...]」 - 它是typedef作爲第一行給出的。 – Xeo

+1

@Xeo:*表頭俯視第一行。 *修正。 –

+0

好的,謝謝,我看了一下字符串的類型,它確實是那種類型!這有助於:)謝謝! –

1

它遍歷strings這是從p3tOffsetTypestring的地圖。如果在映射中找到要查找的字符串,則返回偏移量。如果不是,則它將當前偏移量的字符串存儲爲鍵,並將該字符串的長度添加到全局變量string_offset(我假定它初始化爲零)。

基本上,建立了一個字符串及其偏移量的地圖。所以,如果你用「你好」,「測試」,並把它稱爲「喇嘛」將包含以下內容:

strings[0] = "Hello" 
strings[6] = "test" 
strings[11] = "bla" 

此跟蹤的字符串和它們的位置在「做大」的字符串,所以說話。

+0

謝謝!阿斯蒙德更詳細地解釋了這一點! –