Map :: using size()和循环

时间:2011-09-09 09:30:27

标签: c++

//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

2 个答案:

答案 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

您可能还有其他问题。您的班级员工可能有一个破坏的默认构造函数,即没有正确初始化字符串属性。