如何从迭代器中找到一对的类型?
How to find the type of a pair from iterator?
我是这里的新手,也是模板编程方面的新手。
我有一本字典(意思是,它可以是 std::map
或 std::vector<std::pair<type1, type2>>
或 std::set<std::pair<, >
> ...)
我想写一个算法,就像标准库算法一样
使用传递的容器的迭代器。
思路如下。
#include <iostream>
#include <algorithm>
#include <type_traits>
#include <vector>
#include <array>
#include <map>
#include <set>
#include <iterator>
// two different types
enum EnumA { one, two, three, four, five, six};
enum EnumB { one, three, four, six};
// TypeA TypeB
using map = std::map<EnumA, EnumB>;
// or std::vector<std::pair<EnumA, EnumB>>
// or std::set<std::pair<EnumA, EnumB>>
// or std::array<std::pair<EnumA, EnumB>, 3>
const map itemMap{ // the map
{EnumA::one, EnumB::one},
{EnumA::three, EnumB::three},
{EnumA::six, EnumB::six},
};
template<typename Iterator, typename B>
/* type of KEY(first) of the map/container from the iterator???*/ AfromB(Iterator begin, Iterator end, B bObj)
{
// static_assert(begin != end); // container should not be empty!
using Type = typename std::iterator_traits<Iterator>::value_type;
using AType = decltype( /* how to find the type of KEY(first) of the map/container? */);
using BType = decltype(/* how to find the type of VALUE(second) of the map/container? */);
auto iter = std::find_if(begin, end, [bObj](const Type& entry) { return entry.second == bObj;});
return iter != end ? iter->first: begin->first; // if not found return the first element match
}
// will do BfromA(Iterator begin, Iterator end, B bObj) similarly afterwards
int main()
{
EnumA aEnum = AfromB(itemMap.cbegin(), itemMap.cend(), EnumB::six); // I can use it like
}
代码里可以看到,不知道怎么找类型
key/ first 和 value/second 在字典中。谷歌搜索后,
我发现我可以通过
找到键值对的类型
using Type = typename std::iterator_traits<Iterator>::value_type;
但不适用于那对中的个人。有可能找到吗?
我正在使用 C++11。
抱歉英语不好。感谢您的帮助。
您已经拥有地图值类型:
using Type = typename std::iterator_traits<Iterator>::value_type;
地图值类型是 std::pair<first_type,second_type>
并且要获得一对第一和第二类型,您可以使用它的 first_type
和 second_type
:
using key_type = typename Type::first_type;
using mapped_type = typename Type::second_type;
要将 key_type
用作 return 类型,我可能会使用一个小帮手:
template <typename Iterator>
struct KeyAndMappedType {
using value_type = typename std::iterator_traits<Iterator>::value_type;
using const_key_type = typename value_type::first_type;
using key_type = typename std::remove_const<const_key_type>::type;
using mapped_type = typename value_type::second_type;
};
然后
template <typename Iterator, typename B>
typename KeyAndMappedType<Iterator>::key_type AfromB(Iterator begin, Iterator end, B bObj) {
...
}
请注意,地图 key_type
始终是 const
。由于有时您也需要该类型作为非常量,我决定我的 KeyAndMapType
应该同时提供这两种类型(也许命名应该被颠倒,即 key_type
为 const
和 non_const_key_type
,但我会留给你决定细节)。
我是这里的新手,也是模板编程方面的新手。
我有一本字典(意思是,它可以是 std::map
或 std::vector<std::pair<type1, type2>>
或 std::set<std::pair<, >
> ...)
我想写一个算法,就像标准库算法一样
使用传递的容器的迭代器。
思路如下。
#include <iostream>
#include <algorithm>
#include <type_traits>
#include <vector>
#include <array>
#include <map>
#include <set>
#include <iterator>
// two different types
enum EnumA { one, two, three, four, five, six};
enum EnumB { one, three, four, six};
// TypeA TypeB
using map = std::map<EnumA, EnumB>;
// or std::vector<std::pair<EnumA, EnumB>>
// or std::set<std::pair<EnumA, EnumB>>
// or std::array<std::pair<EnumA, EnumB>, 3>
const map itemMap{ // the map
{EnumA::one, EnumB::one},
{EnumA::three, EnumB::three},
{EnumA::six, EnumB::six},
};
template<typename Iterator, typename B>
/* type of KEY(first) of the map/container from the iterator???*/ AfromB(Iterator begin, Iterator end, B bObj)
{
// static_assert(begin != end); // container should not be empty!
using Type = typename std::iterator_traits<Iterator>::value_type;
using AType = decltype( /* how to find the type of KEY(first) of the map/container? */);
using BType = decltype(/* how to find the type of VALUE(second) of the map/container? */);
auto iter = std::find_if(begin, end, [bObj](const Type& entry) { return entry.second == bObj;});
return iter != end ? iter->first: begin->first; // if not found return the first element match
}
// will do BfromA(Iterator begin, Iterator end, B bObj) similarly afterwards
int main()
{
EnumA aEnum = AfromB(itemMap.cbegin(), itemMap.cend(), EnumB::six); // I can use it like
}
代码里可以看到,不知道怎么找类型 key/ first 和 value/second 在字典中。谷歌搜索后, 我发现我可以通过
找到键值对的类型using Type = typename std::iterator_traits<Iterator>::value_type;
但不适用于那对中的个人。有可能找到吗? 我正在使用 C++11。
抱歉英语不好。感谢您的帮助。
您已经拥有地图值类型:
using Type = typename std::iterator_traits<Iterator>::value_type;
地图值类型是 std::pair<first_type,second_type>
并且要获得一对第一和第二类型,您可以使用它的 first_type
和 second_type
:
using key_type = typename Type::first_type;
using mapped_type = typename Type::second_type;
要将 key_type
用作 return 类型,我可能会使用一个小帮手:
template <typename Iterator>
struct KeyAndMappedType {
using value_type = typename std::iterator_traits<Iterator>::value_type;
using const_key_type = typename value_type::first_type;
using key_type = typename std::remove_const<const_key_type>::type;
using mapped_type = typename value_type::second_type;
};
然后
template <typename Iterator, typename B>
typename KeyAndMappedType<Iterator>::key_type AfromB(Iterator begin, Iterator end, B bObj) {
...
}
请注意,地图 key_type
始终是 const
。由于有时您也需要该类型作为非常量,我决定我的 KeyAndMapType
应该同时提供这两种类型(也许命名应该被颠倒,即 key_type
为 const
和 non_const_key_type
,但我会留给你决定细节)。