C++ 无序映射仅在先前找到的项目之后查找项目
我有一个无序的_映射,它包含一个枚举和一个字符串作为第二个。第一个值可能以不同的顺序出现多次。下面是一个例子:C++ 无序映射仅在先前找到的项目之后查找项目,c++,c++14,unordered-map,C++,C++14,Unordered Map,我有一个无序的_映射,它包含一个枚举和一个字符串作为第二个。第一个值可能以不同的顺序出现多次。下面是一个例子: enum SomeType { TYPE1, TYPE2, }; static std::unordered_map<SomeType, std::string> value_map = { { TYPE2, "Value that shouldn't be found" }, { TYPE1, "Value that gets found
enum SomeType
{
TYPE1,
TYPE2,
};
static std::unordered_map<SomeType, std::string> value_map =
{
{ TYPE2, "Value that shouldn't be found" },
{ TYPE1, "Value that gets found first" },
{ TYPE2, "Value that also never gets found" },
{ TYPE1, "Value that gets found second" },
{ TYPE2, "Value that gets found last" },
};
enum SomeType
{
类型1,
类型2,
};
静态标准::无序映射值映射=
{
{TYPE2,“不应找到的值”},
{TYPE1,“首先找到的值”},
{TYPE2,“也永远找不到的值”},
{TYPE1,“第二个找到的值”},
{TYPE2,“最后找到的值”},
};
我想按如下方式遍历映射:例如,首先我想找到TYPE1
的一对,这将为我获得第一个TYPE1
值。在那之后,再次搜索TYPE1
值并不会让我得到第一个值,而是在它之后找到的下一个值。在此之后搜索TYPE2
值只会净取最后一个值。基本上,我只想找到下一个匹配的值,但在最后一个找到的值之前没有一个匹配的值 我曾多次尝试实现这样的算法,但我不太确定如何实现这样的算法。
如何实现这样的算法
尝试演示我想要的内容的完整代码示例:您可能需要一个std::无序的多映射(multimap)并使用相等的范围:
#include <algorithm>
#include <iostream>
#include <unordered_map>
enum SomeType
{
TYPE1,
TYPE2,
};
static std::unordered_multimap<unsigned, std::string> value_map =
{
{ TYPE2, "Value that shouldn't be found" },
{ TYPE1, "Value that gets found first" },
{ TYPE2, "Value that also never gets found" },
{ TYPE1, "Value that gets found second" },
{ TYPE2, "Value that gets found last" },
};
int main() {
auto range = value_map.equal_range(TYPE1);
for( auto i = range.first; i != range.second; ++i )
std::cout << i->second << '\n';
}
#包括
#包括
#包括
枚举某个类型
{
类型1,
类型2,
};
静态标准::无序的\u多重映射值\u映射=
{
{TYPE2,“不应找到的值”},
{TYPE1,“首先找到的值”},
{TYPE2,“也永远找不到的值”},
{TYPE1,“第二个找到的值”},
{TYPE2,“最后找到的值”},
};
int main(){
自动范围=值映射。相等范围(类型1);
用于(自动i=range.first;i!=range.second;++i)
std::cout second您可能需要一个std::无序多映射(multimap)并使用相等的范围:
#include <algorithm>
#include <iostream>
#include <unordered_map>
enum SomeType
{
TYPE1,
TYPE2,
};
static std::unordered_multimap<unsigned, std::string> value_map =
{
{ TYPE2, "Value that shouldn't be found" },
{ TYPE1, "Value that gets found first" },
{ TYPE2, "Value that also never gets found" },
{ TYPE1, "Value that gets found second" },
{ TYPE2, "Value that gets found last" },
};
int main() {
auto range = value_map.equal_range(TYPE1);
for( auto i = range.first; i != range.second; ++i )
std::cout << i->second << '\n';
}
#包括
#包括
#包括
枚举某个类型
{
类型1,
类型2,
};
静态标准::无序的\u多重映射值\u映射=
{
{TYPE2,“不应找到的值”},
{TYPE1,“首先找到的值”},
{TYPE2,“也永远找不到的值”},
{TYPE1,“第二个找到的值”},
{TYPE2,“最后找到的值”},
};
int main(){
自动范围=值映射。相等范围(类型1);
用于(自动i=range.first;i!=range.second;++i)
std::仅供参考,映射的键必须是唯一的。不能有多个元素具有相同的键。请注意组件名称,无序映射。插入顺序与遍历顺序无关。您需要向量/deque/list/forward_list/成对数组。所有关联容器,有序或无序,都需要我有一个无序的_映射,其中包含一个枚举和一个字符串作为第二个。第一个值可能以不同的顺序出现多次否。仅供参考,映射的键必须是唯一的。不能有多个元素具有相同的键。请注意组件名称,无序映射。插入顺序与遍历顺序无关。您需要向量/deque/list/forward\u list/成对数组。所有关联容器,有序或无序,都需要唯一的键,或我有一个无序的_映射,其中包含一个枚举和一个字符串作为第二个。第一个值可能以不同的顺序出现多次否。这里需要value\u type
吗?@DieterLücking在main中,如果使用value\u type
行删除,而不是std::for\u每个语句写入for(auto i=range.first;i!=range.second;++i)std::cout second,则可以使用std::advance将迭代器提前到所需位置(即最后使用的值),然后使用a搜索所需范围内的每个循环(最后使用的迭代器pos,映射的末尾)对于所需的值。这将实现我的目标。感谢您提供的线索。这里需要value\u type
吗?@DieterLücking在您的main中,如果您删除使用value\u type
行,而不是std::for\u each
语句编写for(auto I=range.first;I!=range.second;++I)std::cout second可以使用std::advance(即最后使用的值)将迭代器提前到所需位置,然后使用a搜索所需范围内的每个循环(最后使用的迭代器位置,映射的末尾)为期望的价值。这将实现我的目标。感谢您的线索。谢谢!这正是我要找的。谢谢!这正是我要找的。
Value that gets found first
Value that gets found second
Value that gets found last
Didn't find a match
Value that gets after the last as new