c++中stl类模板的问题,我想把对象直接放入一个MAP中遍历,问下大神该怎么改

#include "stdafx.h"
#include <iostream>
using namespace std;
#include <map>
#include <string>
class CarDriver
{
public:
CarDriver(string name):m_name(name){}
private:
string m_name;
};
class TruckDriver
{
public:
TruckDriver(string name):m_name(name){}
private:
string m_name;
};
class BusDriver
{
public:
BusDriver(string name):m_name(name){}
private:
string m_name;
};
template <typename T>
class vehicle
{
public:
vehicle<T>(string name,string type,int cout,int speed,int weight):m_driver(name)
{
m_type = type;
m_cout = cout;
m_speed = speed;
m_weight = weight;
}
void show()
{
cout<<m_driver.getName()<<" "<<m_type<<" "<<m_cout<<" "<<m_speed<<" "<<m_weight<<endl;
}
private:
T m_driver;
string m_type;
int m_cout;
int m_speed;
int m_weight;
};
int _tmain(int argc, _TCHAR* argv[])
{
vehicle<CarDriver> car1("zhangsan","car",4,77,500);
vehicle<BusDriver> bus1("chen","bus",30,50,1000);
map<int,vehicle<CarDriver>> m;
m.insert(map<int,vehicle<CarDriver>>::value_type(101,car1));
map<int,vehicle<CarDriver>>::iterator iter;
for (iter = m.begin();iter != m.end();iter++)
{
cout<<iter->first<<endl;
iter->second.show();
}
//vehicle<CarDriver> car4 = reinterpret_cast<vehicle<CarDriver>(bus1);
map<int,vehicle<BusDriver>> n;
n.insert(map<int,vehicle<BusDriver>>::value_type(104,bus1));
map<int,vehicle<BusDriver>>::iterator it;
for (it = n.begin();it != n.end();it++)
{
cout<<it->first<<endl;
it->second.show();
}
return 0;
}

第1个回答  2014-08-07
//代码如下,你自己对比看看
#include <iostream>
#include <map>
#include <string>

using namespace std;

class CarDriver
{
public:
CarDriver(string name):m_name(name){}
const char* getName() const { return m_name.c_str(); }
private:
string m_name;
};

class TruckDriver
{
public:
TruckDriver(string name):m_name(name){}
const char* getName() const { return m_name.c_str(); }
private:
string m_name;
};

class BusDriver
{
public:
BusDriver(string name):m_name(name){}
const char* getName() const { return m_name.c_str(); }
private:
string m_name;
};

template <typename T>
class vehicle
{
public:
vehicle<T>(string name,string type,int cout,int speed,int weight)
:m_driver(name), m_type(type)
{
m_cout = cout;
m_speed = speed;
m_weight = weight;
}

void show()
{
cout<< m_driver.getName() << " "
<< m_type << " " << m_cout << " "
<< m_speed<< " " << m_weight << endl;
}

private:
T m_driver;
string m_type;
int m_cout;
int m_speed;
int m_weight;
};

int main(int argc, char* argv[])
{
vehicle<CarDriver> car1("zhangsan","car",4,77,500);

typedef map< int,vehicle<CarDriver> > vc;
vc m;
m.insert(vc::value_type(101,car1));

vc::iterator iter;
for (iter = m.begin();iter != m.end();iter++)
{
cout<< iter->first << endl;
iter->second.show();
}

vehicle<BusDriver> bus1("chen","bus",30,50,1000);

typedef map< int,vehicle<BusDriver> > vb;
vb n;
n.insert(vb::value_type(104,bus1));

vb::iterator it;
for (it = n.begin();it != n.end();it++)
{
cout<< it->first << endl;
it->second.show();
}

return 0;
}

追问

我是想只要放到一个迭代器中的啊,就是只要一次遍历就够了!

追答

那就用foreach,具体例子我就先不给了,你去查下foreach的用法,不懂再问吧

第2个回答  2014-08-07
for (it = n.begin();it != n.end();it++)
{
cout<<it->first<<endl;
it->second.show();
}
输出的是it.first,在上面it = n.begin();,能够赋值成功吗?

问一个stl的map遍历的问题
两种方式iterator遍历的次数是相同的,但在STL中效率不同,前++--返回引用,后++--返回一个临时对象,因为iterator是类模板,使用it++这种形式要返回一个无用的临时对象,而it++是函数重载,所以编译器无法对其进行优化,所以每遍历一个元素,你就创建并销毁了一个无用的临时对象。不信的话你可以去看看...

关于STL map容器的错误 求高手解答
{ public:a_really_long_class_name() {};int m_data;};void main(){ a_really_long_class_name test_obj;test_obj.m_data = 12;} 类名超过了255个字,使用时就会报4786的waring.在使用STL(C++标准模板库)的时候经常引发类似的错 误,尤其是vector,map这类模板类,模板中套模板,一不小心就...

STL 中怎样遍历一个map中的所有元素 [转载]
map<string,int::iterator it=words.begin();for(;it!=words.end();++it)cout<<"key:"<<it-first <<"value:"<<it-second<<end1;return 0;}std::map<key, value mymap;map<key,value::iterator begiter = mymap.begin();map<key,value::iterator enditer = mymap.end();for(;be...

STL 容器---关联容器--map<Key,Value>
STL map 和 multimap 都是模板类,要使用其成员函数,必须先实例化。要实例化一个std::map对象,你需要提供两个模板参数:键的类型和值的类型。map > mapObj;multimap > mmapObj;第三个模板参数是可选的。如果您值指定了键和值的类型,而省略了第三个模板参数, std::map和 std::multimap 将...

C++的STL中的map的问题。map的嵌套定义可不可以多级嵌套还是说只能二级...
define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <string>#include <map>using namespace std;int main(){map<map<string,int>, map<string,int>> mymap;system("pause");return 0;}三层以上是会报错,超出修饰名的长度,名称被截断,说白一点就是C++不支持太长的类型修饰 ...

在用c++模板类的时候,有段代码是这样的,不太明白里边的make_pair(34,&...
C++标准程序库中凡是“必须返回两个值”的函数, 也都会利用pair对象 class pair可以将两个值视为一个单元。容器类别map和multimap就是使用pairs来管理其健值\/实值(key\/va lue)的成对元素。pair被定义为struct,因此可直接存取pair中的个别值.两个pairs互相比较时, 第一个元素正具有较高的优先级.例...

关于C++STL中的vector,可否把类对象当做元素
没有问题,使用的是stack,不是heap。v3中存的是一个副本。具体过程:1. 创建一个临时的A对象 2. 如果v3有足够的空间,将A对象复制到v3对应的空间(使用赋值函数assignment function);如果v3没有足够的空间,先扩容,再创建一个A对象(使用拷贝函数copy constructor)。3. 然后,临时的A被销毁 这种...

C++实习生面试,一般会问到关于STL的什么知识点
3.STL map和set的使用虽不复杂,但也有一些不易理解的地方,如:map: type pair <constKey, T> ,很多不同的 const Key 对应的 T 对象的一个集合,所有的记录集中只要 const Key 不一样就可以, T 无关! set: type const Key. 只存单一的对 const Key ,没有 map 的 T 对像!可以看...

STL mapmap介绍
在定义map时,需要提供两个模板参数:关键字类型和存储对象类型。例如:std::map<int, std::string> personnel;以上代码定义了一个使用int作为键,指向std::string对象的指针的map容器。为了简化使用,可以进行类型定义:typedef std::map<int, std::string> UDT_MAP_INT_STRING;在定义完成后,可以...

C++STL : unordered_map详解
以及insert、erase等操作方法。插入元素示例如下:`unordered_map my_map; my_map[1] = "one";`。遍历unordered_map可通过迭代器实现,如`for (auto it = my_map.begin(); it != my_map.end(); ++it) { cout < it->first << ": " < it->second << endl; }`。

相似回答