假設我有一個字符串,並且想要查找是否存在某個特定字符(如'|'),那麼做什麼是最好和最快的技術所以?我知道字符串找到實現。我要求比這更快的實現。查找一個字符串是否包含C++中的字符(允許提升)
回答
if (str.find('|') != std::string::npos)
{
// ...
}
有不可能是任何更有效。 O(n)是你能做的最好的。標準的庫實現應該是非常優化的。
只有一種方法可以做到這一點。只需遍歷字符串來檢查你正在尋找的字符是否存在。您可以使用string::find
函數執行此操作,該函數獲取字符並返回字符串中出現的第一個位置,如果該值不存在,則返回string::npos
。您還可以使用std::find
,它獲取兩個迭代器begin
和end
以及鍵值「k」,並返回一個迭代器,指示範圍[begin, end]
中k的第一個出現次數,如果未找到k
,則返回end
。當然,你可以自己實現的查找功能,像這樣:
string::size_type pos=string::npos;
for(string::size_type i=0; i<s.size(); ++i) {
if(s[i] == key) {
pos=i;
break;
}
}
if(pos != string::npos) {
// key was found
} else {
// not found
}
或本:
string::iterator pos=s.end();
for(string::iterator i=s.begin(); i!=s.end(); ++i) {
if(*i == key) {
pos=i;
break;
}
}
if(pos != s.end()) {
// found
} else {
// not found
}
更多關於std::string::find
和std::find
:
考慮到你想要的東西比string :: find更快,我唯一能想到的就是創建一個具有高度自定義賦值運算符的類,它在每次更新字符串時更新一個包含在每個可能字符的字符串中的第一個位置(字符串爲256,寬字符串爲65536(?))。這有O(1)查找的代價,其代價是非常量操作中增加了很多複雜性。
另一種方法是使用strchr函數上的相應c_str字符串:
if(strchr(str.c_str(), '|'))
{
\\found
}
不知道如何比較的std發現,雖然速度方面...
找到的位置字符是
size_t pos = strchr(str.c_str(),'|') - str.c_str();
添加湯姆坦納的答案。如果您不想進行任何先驗計算,您將被卡在O(n)處,即您搜索的字符串的長度與時間消耗之間存在線性相關性。湯姆建議設置一個布爾值的數組(或向量)來表示是否發生某個特定字符。它需要O(n)一次索引字符串,但是如果包含O(1)(恆定時間),則可以檢查任意數量的字符。這種方法的缺點是你需要大量的內存(一旦你決定需要支持unicode)。
作爲一種折衷方案,您可以使用std :: set或類似的方法,只存儲輸入字符串中實際存在的字符。然後,內存消耗將圍繞字符串中不同字符的數量呈線性,但查找將爲O(log n),即時間上的對數。
當然,你應該測量/配置文件,然後在這裏說明一下什麼使用情況,你實際上是優化。在你這樣做之前,堅持最容易理解和閱讀的內容。
從this source與Visual Studio 2013進行實證檢驗編譯器顯示,和strchr常規約爲快兩倍比的std :: string ::找到實施。
確保字符,如果它的工作原理。 –
你可以試試這個:通過'的std :: string`參考
string s1 = "Hello";
string s2 = "el";
if(strstr(s1.c_str(),s2.c_str()))
{
cout << " S1 Contains S2";
}
- 1. 檢查字符串是否只包含允許的字符
- 2. 查找字符串是否包含字
- 3. C++ 11 - Unicode字符串 - 查找是否包含非ASCII字符
- 4. 試圖找到一個字符串是否包含字符串
- 5. 找出一個字符串是否包含唯一字符
- 6. 檢查一個字符串是否包含C++中的字符串
- 7. Applescript:檢查一個字符串是否包含空字符串?
- 8. 如何檢查字符串是否包含C#中的字符?
- 9. 查找字符串是否包含字符串
- 10. 檢查字符串是否包含字符集中的字符
- 11. c# - 檢查字符串是否包含字符和數字
- 12. 檢查一個字符串是否只包含特殊字符
- 13. 檢查一個字符串是否包含給定字符
- 14. 檢查一個字符串是否包含任何字符
- 15. Java - 查看一個字符串是否包含任何字符
- 16. 檢查一個字符串是否包含特定字符
- 17. 檢查一個字符串是否只包含某些字符
- 18. 檢查字符串是否包含字(不是子字符串!)
- 19. 檢查字符串中是否包含一組字符?
- 20. 如何找到一個字符串是否包含在另一個字符串
- 21. 在包含多個字符串的許多對象中查找子字符串
- 22. 查找一個字符串是否包含「」
- 23. VB.net最快的方法來檢查一個字符串是否包含許多字符串中的一個
- 24. 檢查一對字符串是否包含相同的字符?
- 25. 檢查一個字符串是否包含數字和字母
- 26. 一個字符串查找是否有另一個字符串
- 27. 查看一個字符串是否包含另一個字符串
- 28. 有效檢查一個字符串是否包含另一個字符串
- 29. 如何檢查一個字符串是否包含一個子字符串 - mysql
- 30. 檢查一個字符串是否包含另一個字符串
看,你最終會發現'find'。 – chris
取決於您使用的字符串的「形式」。 –
請避免標題中的「最好」和「最快」;前者應[近]總是避免,因爲它增加了什麼價值(「最好」的方式將在「最佳」答案給出),而後者應該避免,除非有具體的測試用例/場景中常見的接近「不夠快」(這需要有* *的東西首先要進行對比的!) – 2012-12-25 06:45:35