[英]Getting a substr from a std::variant<std::string, std::vector<std::string>>> in C++
所以我有一個帶有字符串鍵和字符串或向量值的 map。 我想循環遍歷 map 中的所有字符串值(無論它們是在向量中找到還是可以直接檢查),並檢查它們是否與給定字符串匹配(與字符串是什么無關)。 如果該字符串完全或部分匹配,我會將找到該字符串的 map 放入向量中。
我遇到的問題是,即使我使用 if 條件將字符串與向量分開, substr
function 認為我正在處理std::variant<std::string, std::vector<std::string>>>
因此給了我一個錯誤。
else 函數中的 begin 函數也告訴我,由於這個原因,variant 沒有名為“begin”的成員。 我完全迷路了,任何幫助都會很棒。
for (std::unordered_map<std::string,
std::variant<std::string,
std::vector<std::string>>>::iterator h = MyMap.begin();
h != MyMap.end();
h++) {
if (typeid(h->second) == typeid(std::string)) {
std::string MapValueString = h->second.substr(0, TextCtrlValue.length());
if (MapValueString == TextCtrlValue) {
RightSearchResultsVector.insert(RightSearchResultsVector.end(), Maps.begin(), Maps.end());
}
}
else {
for (std::vector<std::string>::iterator f = h->second.begin(); f != h->second.end(); f++) {
// Go through vector and find matching/semi matching strings
}
}
}
以下是如何判斷變體持有什么類型
std::string* pstr = std::get_if<std::string>(&h->second);
if (pstr != nullptr)
{
// do stuff with string
}
else
{
std::vector<std::string>& vec = std::get<std::vector<std::string>>(h->second);
// do stuff with vector
}
順便說一句,你可以簡化這個怪物
for (std::unordered_map<std::string,
std::variant<std::string,
std::vector<std::string>>>::iterator h = MyMap.begin();
通過寫作
for (auto h = MyMap.begin();
明智地使用auto
可以極大地提高代碼的可讀性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.