就是简单的字符串比较和排序。
一开始看到之前写的代码是用了map,觉得没必要用map,只需要pair就可以了。等做完才发现原来输出要求是要按id的字典序排序的,而map在插入的过程中就自动排序了。所以最后还是用了map,省得自己写排序^_^。
先贴下之前的代码,应该是不熟悉string(可能是混淆了C和C++的string导致错误又懒得去解决,所以使用了数字的比较,写得很繁琐,但很可爱地处理了输入"."的问题。←_←NC)
需要注意的是每次循环需要先清空idMap。
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main()
{
int n;
string id[20];
map<string, string> idMap;
map<string, string>::iterator it;
int ip[20][5];
int i, j, k, m;
char aDot;
int count;
cin >> n;
while( n != 0 ) {
idMap.clear();
for( i = 0; i < n; i++ )
{
j = 0;
cin >> id[i];
for( j = 0; j < 3; j++ )
{
cin >> ip[i][j];
cin >> aDot;
}
cin >> ip[i][j];
ip[i][4] = 0; // 标志位,0为未发现
for( k = 0; k < i; ++k )
{
if( ip[i][4] == 0 )
{
count = 0;
for( m = 0; m < 4; ++m )
{
if( ip[k][m] != ip[i][m] )
break;
else
count++;
}
if ( count == 4 )
{
ip[i][4] = 1;
ip[k][4] = 1;
idMap.insert(pair<string, string>(id[k], id[i]));
break;
}
}
}
}
for( it = idMap.begin(); it != idMap.end(); ++it )
cout << it -> second << " is the MaJia of " << it->first << endl;
cout << endl;
cin >> n;
}
return 0;
}
接下来贴新写的代码。由于混淆了C和C++的string。include进来的是string却用了strcmp函数,导致报错——“no matching function for call to 'strcmp(std::string&, std::string&)”,查了一下发现C++直接用大于号小于号等号比较字符串,所以果断用C++的字符串了,而不改成include<cstring>。
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main()
{
int n;
string id[20], ip[20];
map<string, string> idMap;
map<string, string>::iterator it;
int i, j, k, cnt;
cin >> n;
while( n != 0 ) {
idMap.clear();
for( i = 0; i < n; i++) {
cin >> id[i] >> ip[i];
}
for (i=0;i<n;i++) {
for (j=i+1;j<n;j++)
if (ip[i] == ip[j])
idMap.insert(make_pair(id[i],id[j]));
}
for ( it = idMap.begin(); it != idMap.end(); ++it ) {
cout << it->second << " is the MaJia of " << it->first << endl;
}
cout << endl;
cin >> n;
}
return 0;
}
转载于:https://blog.51cto.com/xuewei/1348506