地图的迭代器类型是什么?

What is the type of map's iterator?

提问人:emirhan demir 提问时间:7/8/2022 最后编辑:JeJoemirhan demir 更新时间:7/9/2022 访问量:558

问:

我是C++的新手。我发现要查看变量的类型,我可以在库上使用。typeid().name()std::typeinfo

但是当我在地图数据结构上实现这个函数时,我得到了这个输出

itr 的类型是 :

St17_Rb_tree_iteratorISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiEE

这是什么意思?实际上,我想知道 itr 的类型是什么,它是代码部分中 map 的迭代器。

#include <iostream>
#include <string>
#include <iterator>
#include <map>
#include <typeinfo>    
using namespace std;
    
int main()
{

    map <string, int> map1;    
    map1.insert({"A",1});

    auto itr = map1.begin();        // Iterator is created by auto

    for (itr; itr != map1.end(); itr++)
    {
        cout<<itr->first<<"  "<<itr->second<<"\n";
    }    
    cout<<"Type of itr is : "<<typeid(itr).name();
    
    return 0;
}
C++ 11 迭代器 stdmap c++-标准库

评论

0赞 Ryan Zhang 7/8/2022
嗯,这就是它的类型。在实践中,它几乎类似于 .例如,采取不会导致错误,并且按预期工作。pair<string, int>pair<string, int> pr = *itr;
0赞 mch 7/8/2022
迭代器的类型为 。std::map<std::string, int>::iterator

答:

3赞 JeJo 7/8/2022 #1

我想知道 itr 的类型是什么,它是代码部分中 map 的迭代器?

的类型是map1.begin()

std::map<std::string, int>::iterator

您可以通过以下方式进行测试

#include <type_traits> // std::is_same_v

static_assert(std::is_same_v<
     decltype(map1.begin()), std::map<std::string, int>::iterator>
    , "are not same");

即关键字和上述内容的替代品(即),您也可以使用。autostd::map<std::string, int>::iteratordecltype(map1.begin())


St17_Rb_tree_iteratorISt4pairIKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiEE

这是什么意思?

它是编译器实现中类型的名称。从 std::type_info::name

返回一个实现定义的以 null 结尾的字符串,该字符串包含类型的名称。不提供任何保证;特别是,对于多个类型,返回的字符串可以是相同的,并且在同一程序的调用之间可以更改。

因此,它可能会因编译器而异,并且不能说这看起来总是一样的。 例如,在此处查看不同编译器中的类型:https://gcc.godbolt.org/z/ProxxaxfWmap1.begin()