所以我得到了一个带有字符串键和字符串或向量值的映射。我希望循环遍历映射中的所有字符串值(无论它们是在向量中找到的还是可以直接检查的),并检查它们是否与给定的字符串匹配(与字符串的内容无关)。如果该字符串完全或部分匹配,我将在向量中放置字符串所在的映射。
我遇到的问题是,尽管我使用一个if条件将字符串从向量中分离出来,但substr
函数认为我正在处理一个std::variant<std::string, std::vector<std::string>>>
,因此给了我一个错误。
否则函数中的begin函数也告诉我,由于这个原因,变体没有一个名为"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
}
}
}
发布于 2022-08-02 05:21:04
下面是如何判断一个变体的类型
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
可以极大地提高代码的可读性。
https://stackoverflow.com/questions/73202227
复制相似问题