2016-07-12 24 views
2

在這個website我發現了一個有趣的方式來創建一個帶有字符串的switch語句。但是,這看起來很長,並且很漫長。我想知道是否可以將特定的字符串轉換爲可用於switch語句的整數。(C++/QT)通過將字符串轉換爲int來使用switch語句

因此,僞代碼將是這樣的

QString str = "spinbox_1"; 

switch stoi(str) 
case 1543: 
    //code here 
case 2343: 
    //code here 
case 3424: 
    //code here 
+0

你是否嘗試從字符串中使用int並在switch語句中使用它? – juanchopanza

+0

你爲什麼要這樣做?鏈接的解決方案看起來好多了。 – Arunmu

回答

1

如果我發現自己處於類似的情況,我使用映射從給定的字符串中定義特定的int。

例如:

// The string you want to convert to an int 
std::string myString = "stringTwo"; 

// The mapping that you set for string to int conversions 
std::map<std::string, int> stringToInt = \ 
    {{"stringOne" , 1}, 
    {"stringTwo" , 2}, 
    {"stringThree", 3}}; 

// Here, myInt is define as 2 
int myInt = stringToInt[myString]; 

現在,你可以把myInt到交換機的情況。

+0

顯然QString而不是std ::字符串 – nosbor

+1

這正是它在作者提供的鏈接上實現的方式以及他想要避免的內容 – Slava

+1

@Slava對,它是一樣的。 – nosbor

0

不,這是不可能的字符串唯一一般映射到一個整數 - 還有比整數更簡單的字符串。你可以計算不太可能碰撞2個不同字符串的哈希值,然後比較它們,但仍然有可能2個不同的字符串具有相同的哈希值,因此在檢查哈希值後必須比較這些字符串。這是如何實現std::unordered_setstd::unordered_map(又名hash_set和hash_map),以便您可以使用它們。但是你不會使用switch()聲明。

+1

OP對'case'使用'swich'的意圖意味着在編譯時和有限的情況下可能的字符串集合是已知的。對於任何這樣的設置,可以構建一個函數,將該字符串從該集合映射到唯一的整數 – mvidelgauz

+0

不,它不暗示,如果有這樣的函數,那麼只需使用'switch'就可以得到結果 – Slava

2

正如@Slava所說的那樣,這並不容易。作者在上述鏈接中提供的解決方案可能是最實用的解決方案。但是如果你出於某種原因真的需要以其他方式完成並將字符串轉換爲十進制數,那麼可以使用哈希方法。請參閱下面的廣泛使用的cityhash(顯然,您可以使用任何其他散列函數)。 https://github.com/google/cityhash

這可能是重複的: How can I hash a string to an int using c++?

+0

謝謝,我也會給這個鏡頭。哈希可能適用於我的情況。 – tisaconundrum