這個問題在這里已經有了答案: 將變數與多個值進行比較的最有效方法? (7 個回答) 如何比較 if 陳述句中的多個字串? (5 個回答) 7 天前關閉。
我正在嘗試使用 if 陳述句來檢查用戶輸入的星期幾(3 位字串,即“Fri”)是否等于作業日。用戶輸入的變數存盤在“dayOfWeek”中
我想用下面的代碼做到這一點:
if (dayOfWeek == ("Mon"|| "Tue" || "Wed" || "Thu" || "Fri")){
}
我希望這段代碼讀作“如果一周中的某一天等于“星期一”或“星期二……等”,以便 if 陳述句對于這些輸入中的任何一個都回傳 true
然后我收到以下錯誤訊息:
二進制運算式的無效運算元('std::string'(又名'basic_string')和'bool')
我知道一個可能的解決方法是為每個輸入重復“dayOfWeek ==”,但這似乎并不直觀,并且會創建一個很長的 if 陳述句。
我的方法是不可能的還是有更好的方法?
uj5u.com熱心網友回復:
正如你所發現的那樣,遺憾的是 c 不是英語。你需要
if (dayOfWeek == "Mon"||
dayOfWeek == "Tue" ||
dayOfWeek == "Wed" ||
dayOfWeek == "Thu" ||
dayOfWeek == "Fri"){
}
你要求最有效的 - 我錯過了。
這是肯定的。
它是最“優雅”和“靈活”的嗎?- 不
集合的答案當然是優雅和靈活的,但對我來說它掩蓋了意圖,特別是如果集合 def 遠離檢查代碼
uj5u.com熱心網友回復:
通過一些其他作業,我們可以使幾乎所需的語法作業,并且也可以合理有效地作業。
我們首先定義一個string_set型別來保存我們要搜索的字串集:
class string_set {
std::vector<std::string_view> strings;
public:
string_set(std::string_view s) { strings.push_back(s); }
string_set& operator (std::string_view s) { strings.push_back(s); return *this; }
string_set& operator (string_set const &other) {
std::copy(other.strings.begin(), other.strings.end(), std::back_inserter(strings));
return *this;
}
string_set& operator||(string_set const &other) { return *this other; }
string_set& operator||(std::string_view other) { return *this other;}
friend bool operator==(std::string_view s, string_set const &ss ) {
return std::any_of(ss.strings.begin(), ss.strings.end(),
[&](std::string_view t) { return s == t; }
);
}
};
然后我們定義一個用戶定義的文字運算子來從字串中創建一個:
// uses implicit conversion from `string_view` to `string_set`.
// Some may prefer to do that explicitly.
string_set operator"" _ss(char const *s, std::size_t len) { return std::string_view(s, len); }
有了這些,我們可以創建一個 string_set 并像這樣測驗成員資格if (input == "Mon"_ss "Tue" "Wed" "Thu" "Fri"):如果您更喜歡使用||而不是 ,您可以這樣做,但由于它的優先級較低,您需要將字串括在括號中:if (input == ("Mon"_ss || "Tue" || "Wed" || "Thu" || "Fri"))。
該==運算子在我們給出的字串中進行線性搜索。如果有很多字串,這不是一個好主意,但它的目的是像上面那樣使用,在if陳述句中直接指定一組字串,所以我們正在針對小集合進行優化——想一想像一打左右作為上限。
當然,如果我們真的想要更高效地處理大量字串,我們也可以這樣做。例如string_view,我們可以構建一個 trie 并搜索它,而不是一個向量和一個線性搜索。這往往會以花費更多時間構建 trie 為代價來優化搜索速度,因此如果我們這樣做了,我們可能希望(出于一種可能性)進行構建階段constexpr,因此它可能/將全部發生在編譯時時間。至少在我看來,對于第一次切入來說,這將是非常嚴重的矯枉過正。
由于它使用std::string_view,這確實需要 C 17 或更高版本。
uj5u.com熱心網友回復:
這里有一個例子
#include<iostream>
#include<vector>
#include <set>
#include <string>
int main()
{
std::set<std::string> container = {
"Mon",
"Tue" ,
"Wed" ,
"Thu" ,
"Fri"
};
std::cout<<(container.find("Mon") != container.end());
}
如果您想了解更多關于集合的資訊,請查看本指南
希望它會有所幫助
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/449348.html
上一篇:python:在多個變數中查找值
