Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.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++中使用地图名和打印映射定义In类的映射迭代器_C++ - Fatal编程技术网

在C++中使用地图名和打印映射定义In类的映射迭代器

在C++中使用地图名和打印映射定义In类的映射迭代器,c++,C++,首先,我可以为下面的类声明一个映射迭代器吗 class obj { public: map<int,double> m1; }; map<int,obj> m; 作为m::迭代器it=m.begin;或者我应该将其声明为map::iterator it=m.begin 其次,我想打印地图m。 如何打印上面给定的地图,该地图的值数据类型为class,而该类包含另一个地图?您始终可以使用这个名为auto的便捷小功能。它可以在某些上下文中代替类型使用,比如在声明变量

首先,我可以为下面的类声明一个映射迭代器吗

class obj {
public:
    map<int,double> m1;
};

map<int,obj> m;
作为m::迭代器it=m.begin;或者我应该将其声明为map::iterator it=m.begin

其次,我想打印地图m。
如何打印上面给定的地图,该地图的值数据类型为class,而该类包含另一个地图?

您始终可以使用这个名为auto的便捷小功能。它可以在某些上下文中代替类型使用,比如在声明变量时

在您的代码中,它将如下所示:

struct obj {
    map<int,double> m1;
};

map<int,obj> m;

// Here! The compiler will replace the `auto` placeholder by `map<int,obj>::iterator`
auto it = m.begin();
至于问题的第二部分,只需两个range for loop即可:

for (auto&& [key1, value1] : m) {
    std::cout << key1;

    for (auto&& [key2, value2] : value1.m1) {
        std::cout << key2 << value2;
    }
}
上面的代码将在一行中输出地图的所有数据,不带空格


上面的代码使用自动&&。它与auto非常相似,但它会将类型推断为引用。

您可以随时使用这个名为auto的便捷小功能。它可以在某些上下文中代替类型使用,比如在声明变量时

在您的代码中,它将如下所示:

struct obj {
    map<int,double> m1;
};

map<int,obj> m;

// Here! The compiler will replace the `auto` placeholder by `map<int,obj>::iterator`
auto it = m.begin();
至于问题的第二部分,只需两个range for loop即可:

for (auto&& [key1, value1] : m) {
    std::cout << key1;

    for (auto&& [key2, value2] : value1.m1) {
        std::cout << key2 << value2;
    }
}
上面的代码将在一行中输出地图的所有数据,不带空格


上面的代码使用自动&&。它与auto非常相似,但它会将类型推断为引用。

迭代器可以声明为- std::mapiterator it=m.begin

打印它们-

for (std::map<int, obj>::iterator it = m.begin(); it != m.end(); ++it) {
    std::cout << it->first;
    for (std::map<int, double>::iterator it1 = it->second.m1.begin(); it1 != it->second.m1.end(); ++it1) {
        std::cout << it1->first << it1->second;
    }
}

迭代器可以声明为- std::mapiterator it=m.begin

打印它们-

for (std::map<int, obj>::iterator it = m.begin(); it != m.end(); ++it) {
    std::cout << it->first;
    for (std::map<int, double>::iterator it1 = it->second.m1.begin(); it1 != it->second.m1.end(); ++it1) {
        std::cout << it1->first << it1->second;
    }
}

非常感谢您的回答。但我的问题是map是在一个文件中的类中定义的,我通过将类的对象传递给print函数,在另一个文件中打印它。我不能仅仅通过使用像m::iterator it=m.begin这样的映射名来声明迭代器吗;尝试使用@Guillaume建议的auto谢谢你的回答。但我的问题是map是在一个文件中的类中定义的,我通过将类的对象传递给print函数在另一个文件中打印它。我不能仅仅通过使用像m::iterator it=m.begin这样的映射名来声明迭代器吗;按照@guilloum的建议尝试使用auto