2014-03-30 194 views
3

我有幾個字符串的長度爲2000 - 3000個字符,我想將長度爲X的每個子字符串散列爲一個unordered_multimap。因此,我逐字符遍歷每個字符串以確定每個散列。 substr函數創建一個新的字符串,並且將一個std :: pair插入到multimap中。我想盡可能避免。有沒有辦法解決這個問題?如何在不創建新對象的情況下引用substr?

僞碼示例:

For each String str: 
    For i to str.length - hashlength 
     hash = str.substr(i, hashlength) //A 
     unordered_multimap.insert({{hash, i}}); //B 

我寧願有A和B部分使用盡可能少的構造函數調用越好。

+0

啓用C++ 11並將hash聲明爲'string &&' – texasbruce

+1

如果hash是一個'std :: string',您可以在循環中重用,那麼您可以調用use'hash.assign(str.begin()+ i,str .begin()+ i + hashlength)'並且至少保存一個分配。 –

+0

如果你想將它存儲在地圖中,那麼至少需要**一**結構 – Paranaix

回答

6

有幾個庫可以讓你做到這一點。如boost::string_refllvm::StringRef。類似的課程string_view(其中boost::string_ref基於此課程)正在進行未來標準化工作。如果你不想下載另一個庫,那麼這個類很容易實現。它只是指示子字符串的起始處的一個const char*,以及指示長度的整數(或者指示終點的另一個指針)以及一些實用函數。

所有這些類都需要注意的一個常見事情是,只要使用引用對象,就需要確保源字符串保持活動且未修改(或者至少確保不發生重新分配) 。換句話說,對待它們的方式與指針相同(因爲它本質上就是它們的意思)。

+0

這是否需要重寫hashcode函數? – whytheman

+0

@whytheman:是的,除非您使用爲您提供散列函數的庫。我相信'llvm :: StringRef'確實,並且我確信(或者至少我希望)'string_view'將會在標準化時被使用。 –

+0

string_view已經包含在C++ 17中,那麼這是最好的選擇 – Tecoberg

相關問題