map容器使用中的陷阱【经验】

1.在使用*map指针类型时,不可使用类似于数组的下标寻址方法。编译器会报错,“base operand of “->” has non-pointer-type…….”。
出现此问题时,可利用find()函数返回所需元素的迭代器iter。通过iter->second获取所需值,可避免编译器报错。
2.在利用遍历删除map中元素时,注意迭代器的使用,使用不当会造成迭代器的失效。因为,当迭代器所指向元素被删除之后,此迭代器所指向位置即为一个已经不存在的位置(关联容器的特性),此时迭代器失效。
为避免这一情况,应该:

xxx.cpp

    std::map<int,int> A;
    std::map<int,int>::iterator iter;

    for (int i = 0;i < 5;i++)
    {
        //避免对空map进行读写操作
        A.insert(pair<int,int>(i,i));
    }

    for (iter == A.begin();iter != A.end();)
    {
        A.erase(iter++);
        //C++ 11标准中使用该方法,erase返回值为一个指向当前                下一位置的迭代器
        //iter = A.erase(iter);
    }

3.通常利用for循环遍历map时,程序每次都是对map从头进行遍历。但在有些情况下,遍历会在某种条件下被终止,并需要记录当前的结束位置,下次运行时,从此位置继续遍历。因此,需要用一个迭代器来记录下次执行的起始位置(即先前执行结束的下一个位置)。值得注意,其中的具体写法:

xxx.cpp

std::map<int,int> B;
std::map<int,int>::iterator iter;

for (int i = 0;i < 5;i++)
{
        //避免对空map进行读写操作
        B.insert(pair<int,int>(i,i));
}
std::map<int,int>::iterator iterB = B.begin();

for(iter == iterB;iter != B.end();iter++)
{
    //不可直接写为iterB = iter++;否则将无法使iterB指向下一位置
    iterB = iter;
    iterB++;
}

你可能感兴趣的:(经验-c++编程)