//employee is class with public members salary and nname
int main()
{
map<int,employee> employees;
employee e1;
strcpy(e1.nname,"aaa");
e1.salary=25000;
employee e2;
strcpy(e2.nname,"ccc");
e2.salary=26000;
employees[1]=e1;
employees[2]=e2;
employee e3;
strcpy(e3.nname,"bbb");
e3.salary=26000;
employees[5]=e3;
employee ee;
cout<<employees.size()<<endl;
for(int i=0;i<employees.size();i++)
{
ee=employees[i];
cout<<ee.nname<<endl;
}
o/p: 3 - //so i=3 displays employees[0],1,2,3
aaa - //i=
ccc -
- //2 blank lines
- // <---why blank line cming ,ok cause no data but why it
bbb - //executed 4th and 5th time and we got
// employees[5] ----- bbb?????
//when i printed value of"i" i got from 0 to 5!!!
--------------
can any1 explain thanx in advance
答案 0 :(得分:3)
您正在显示employees[i]
,其中i= 0,1,2,3,4,5
如果在进入for循环之前employees.size() == 3
,为什么要显示6个条目?
答案是,在i==0
时,您要在employees[0]
处向地图添加条目。
(这是因为map::operator[]
返回一个引用,如果该条目不存在,则会创建一个)。
现在,employees.size()
等于4。
调用employees[1],[2]
不会改变地图,但由于大小为4,您还访问employees[3]
,而employees[4]
又会向地图添加一个条目(依此类推employees[5]
)。
当您到达map<int, employee>::iterator it;
for (it = employees.begin(); it != employees.end(); ++it)
{
ee = it->second;
cout<< ee.nname << endl;
}
时会停止,因为它存在于地图中且地图不再生长。
如果要遍历映射条目,请使用迭代器。
{{1}}
PS-请让你的代码可读。
答案 1 :(得分:1)
好的,让我们用一个更有控制的例子来试试这个:
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main()
{
map<int,string> db;
db[1] = string("index = 1");
db[2] = string("index = 2");
db[5] = string("index = 5");
for (size_t i = 0; i < db.size(); i++)
{
cout << i << " : " << db[i] << endl;
cout << "size is : " << db.size() << endl;
}
return 0;
}
现在,问题在于当您访问db[0]
,db[3]
和db[4]
时,您实际上是在地图中添加元素。
0 :
size is : 4
1 : index = 1
size is : 4
2 : index = 2
size is : 4
3 :
size is : 5
4 :
size is : 6
5 : index = 5
size is : 6
您可能还有其他问题。您的班级员工可能有一个破坏的默认构造函数,即没有正确初始化字符串属性。