2014-10-29 42 views
0

我通常不用Visual C++工作,但我想知道我能做些什麼來加速這個邏輯......並且如果有更好的方法來做到這一點。在Visual C++中執行此操作的更好方法是什麼?

我有這樣內容的map<wstring, wstring>

\Device\CdRom0\, E:\ 
\Device\CdRom1\, F:\ 
\Device\HarddiskVolume1\, 
\Device\HarddiskVolume4\, C:\ 
\Device\HarddiskVolume5\, D:\ 

而且我有一個巨大的具有以下格式的字符串列表:

L"\\Device\\HarddiskVolume4\\Users\\User\\Documents\\Visual Studio 2013\\Projects\\FileLocker\\FileLocker\\bin\\Debug\\Test.txt"; 

我的整個目的是獲取字符串中以上格式,使用該映射作爲查找類型,並將這些字符串轉換爲以下格式(將上述字符串轉換爲驅動器路徑的示例):

L"C:\\Users\\User\\Documents\\Visual Studio 2013\\Projects\\FileLocker\\FileLocker\\bin\\Debug\\Test.txt"; 

我目前做的方式是(每串)如下:

std::wstring test = ... 
for (map<wstring, wstring>::iterator i = volumes.begin(); i != volumes.end(); ++i) 
{ 
    if (test.find((*i).first.c_str()) == 0) 
    { 
     test = test.replace(0, wcslen((*i).first.c_str()), (*i).second.c_str()); 
    } 
} 

但這裏有很多的字符串,並且性能真的可以一擊!有什麼更好的方法來執行此查找並分配到手頭的字符串?

+0

地圖鍵總是由斜槓分隔的兩個路徑元素嗎? – 2014-10-29 01:31:08

+0

我不確定;在我的系統上是的,但我不確定是否總是這樣,因爲我正在使用一些未公開的Windows API來生成這些音量字符串......我不確定什麼格式的音量字符串總是應該被表示。 – Alexandru 2014-10-29 01:39:48

回答

1

如果您知道總是有兩個匹配的\分隔的字詞,請只提取該字符串的那一部分,然後在地圖中搜索 - 或者嘗試使用散列圖。

如果你要堅持邏輯的map和相同的風格,你可以替換...

if (test.find((*i).first.c_str()) == 0) 

...與test.compare(0, i->first.size(), i->first),因此它不嘗試匹配沿每個位置串。

你也可以打造的解決步驟一棵樹:

\Device\ ---> Cdrom ---> 0 
     |     1 
     | 
     ---> HardDiskVolume ---> 1 
            4 
            5 

C++標準庫沒有因爲雖然造型這提供了一個方便的容器類型 - 如果深度總是3,您可以硬編碼幾張地圖(最後一個數字可能是一個數組),否則有例如助推圖。

+0

在我解釋這個問題的方式上,我的行爲很糟糕,而且我喜歡你的提議,但目前我完全不確定Windows中的卷路徑是否總是採用這種格式。在我的系統上,似乎總是這樣,但我擔心這些API可能會在其他地方產生不同的結果。 – Alexandru 2014-10-29 01:41:44

+0

@亞歷山大:我不知道我自己......還沒有使用過它們。當然,如果您知道'用戶'始終是您可以搜索的第一個非音量路徑組件,但這也是非常有限的。 – 2014-10-29 01:44:51

1

成功替換後,使用break;退出for循環。通過消除與其他驅動器匹配的嘗試,這將使性能提高一倍。如果大致瞭解驅動器外觀的頻率,則按該頻率排序地圖將增加中斷的有效性。

+0

有時我希望他們讓我接受堆棧溢出兩個或更多的答案...... :( – Alexandru 2014-10-29 19:53:01

相關問題