none
容器问题,请大家帮我看看怎么回事? RRS feed

  • 问题

  • 测试代码如下:

    #include <string>
    #include <iostream>
    #include <map>
    #include <iomanip>
    #include <algorithm>
    #include <list>
    
    using namespace std;
    
    int main(void)
    {
    	typedef multimap<string, string> StringStringMap;
    	typedef string personname;
    	typedef string phonenumber;
    	typedef list<personname> personnamelist;
    
    	personname pn;
    	phonenumber pnb;
    	string flag("Y");
    	StringStringMap mmap;
    	StringStringMap::iterator iter_mmap;
    	personnamelist pl;
    	personnamelist::iterator iter_pl;
    
    	//Input person name and phone number
    	do 
    	{
    		if (flag=="N")
    			break;
    		cout << "Input person name with Enter to end: ";
    		getline(cin, pn, '\n');
    		pl.push_back(pn);
    		cout << "Input phone number with Enter to end: ";
    		getline(cin, pnb, '\n');
    
    		mmap.insert(make_pair(pn, pnb));
    		//mmap.insert(pair<string, string>(pn, pnb));
    
    		cout << "Whether to continue with Yes(Y) or No(N):";
    	} while (getline(cin, flag));
    
    	//Output person name and phone number
    	cout << "Output person name and phone number: " << endl;
    	cout.setf (ios::left, ios::adjustfield);
    	for (iter_mmap=mmap.begin() ; iter_mmap!=mmap.end() ; iter_mmap++)
    		cout << " " << setw(10) << iter_mmap->first << iter_mmap->second << endl;
    	cout << endl;
    	pl.sort();
    	cout << "Output person name by character: " << endl;
    	for (iter_pl=pl.begin() ; iter_pl!=pl.end() ; iter_pl++)
    	{
    		cout << *iter_pl << endl;
    	}
    	for (iter_mmap=mmap.begin() ; iter_mmap!=mmap.end() ; )
    	{
    		StringStringMap::iterator::difference_type countvalue;
    		if ((countvalue=std::count(pl.begin(), pl.end(), iter_mmap->first))>1)
    		//if ((countvalue=mmap.count(pn))>1)
    		{
    			cout << iter_mmap->first << ": ";
    			for (iter_mmap=mmap.lower_bound(iter_mmap->first) ; iter_mmap!=mmap.upper_bound(iter_mmap->first) ; iter_mmap++)
    			{
    				cout << " " << iter_mmap->second <<endl;
    			}
    		}
    		else
    			iter_mmap++;
    	}
    
    	system("pause");
    	return 0;
    }

    生成并运行结果如下:

    能有人告诉我这是为什么吗?

    注:我的运行环境是VS2010SP1 标准C++


    煮酒论英雄

    2012年10月16日 6:49

答案

  • 您最后的那个for循环里写的有问题吧,帮您修改了一下,没测试过:
    for (iter_mmap=mmap.begin() ; iter_mmap!=mmap.end() ; iter_mmap++)
    	{
    		StringStringMap::iterator::difference_type countvalue;
    		if ((countvalue=std::count(pl.begin(), pl.end(), iter_mmap->first))>1)
    			//if ((countvalue=mmap.count(pn))>1)
    		{
    			cout << iter_mmap->first << ": ";
    			for (StringStringMap::iterator iter_mmap2=mmap.lower_bound(iter_mmap->first) ; iter_mmap2!=mmap.upper_bound(iter_mmap->first) ; iter_mmap2++)
    			{
    				cout << " " << iter_mmap2->second <<endl;
    			}
    		}
    	}


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2012年10月16日 7:34
    版主
  • 谢谢你的回答,不过问题依旧存在,经过我好久的思考终于知道怎么回事了?就像你说的那样,最后循环写的有问题,“iter_mmap->first” 和“iter_mmap++”存在矛盾,一个应该是不变,一个要求改变。

    最终我把程序修改好了。如下:

    	for (iter_mmap=mmap.begin() ; iter_mmap!=mmap.end() ; )
    	{
    		StringStringMap::iterator::difference_type countvalue;
    		pn = iter_mmap->first;
     		if ((countvalue=std::count(pl.begin(), pl.end(), pn))>1)
    		//if ((countvalue=mmap.count(pn))>1)
    		{
    			cout << iter_mmap->first << ": " << endl;
    			for (iter_mmap=mmap.lower_bound(pn) ; iter_mmap!=mmap.upper_bound(pn) ; iter_mmap++)
    			{
    				cout << " " << iter_mmap->second <<endl;
    			}
    		}
    		else
    			iter_mmap++;
    	}


    煮酒论英雄

    2012年10月16日 7:40

全部回复

  • 您最后的那个for循环里写的有问题吧,帮您修改了一下,没测试过:
    for (iter_mmap=mmap.begin() ; iter_mmap!=mmap.end() ; iter_mmap++)
    	{
    		StringStringMap::iterator::difference_type countvalue;
    		if ((countvalue=std::count(pl.begin(), pl.end(), iter_mmap->first))>1)
    			//if ((countvalue=mmap.count(pn))>1)
    		{
    			cout << iter_mmap->first << ": ";
    			for (StringStringMap::iterator iter_mmap2=mmap.lower_bound(iter_mmap->first) ; iter_mmap2!=mmap.upper_bound(iter_mmap->first) ; iter_mmap2++)
    			{
    				cout << " " << iter_mmap2->second <<endl;
    			}
    		}
    	}


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2012年10月16日 7:34
    版主
  • 谢谢你的回答,不过问题依旧存在,经过我好久的思考终于知道怎么回事了?就像你说的那样,最后循环写的有问题,“iter_mmap->first” 和“iter_mmap++”存在矛盾,一个应该是不变,一个要求改变。

    最终我把程序修改好了。如下:

    	for (iter_mmap=mmap.begin() ; iter_mmap!=mmap.end() ; )
    	{
    		StringStringMap::iterator::difference_type countvalue;
    		pn = iter_mmap->first;
     		if ((countvalue=std::count(pl.begin(), pl.end(), pn))>1)
    		//if ((countvalue=mmap.count(pn))>1)
    		{
    			cout << iter_mmap->first << ": " << endl;
    			for (iter_mmap=mmap.lower_bound(pn) ; iter_mmap!=mmap.upper_bound(pn) ; iter_mmap++)
    			{
    				cout << " " << iter_mmap->second <<endl;
    			}
    		}
    		else
    			iter_mmap++;
    	}


    煮酒论英雄

    2012年10月16日 7:40