Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无序映射仅在先前找到的项目之后查找项目_C++_C++14_Unordered Map - Fatal编程技术网

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