在名为CodinGame的MIME Type拼图中,我们要求制作一个程序:
我能够解决这个难题。我在这里的第一次尝试更复杂。然而,我在这个问题中发布了它,因为我有一个奇怪的错误,我无法弄清楚背后的原因是什么。
考虑包含扩展及其相应MIME类型的以下文件(" MIME.dat"):
html
text/html
png
image/png
gif
image/gif
同时考虑包含文件名称的以下文件(" names.dat):
animated.gIf
portrait.png
index.html
预期输出(遵循名称在文件中出现的顺序):
image/gif
image/png
text/html
这是我的代码:
#include <iostream>
#include <string>
#include <map>
#include <fstream>
#include <cstdlib>
using namespace std;
struct cmp_ins {
bool operator()(const string& s1, const string& s2) const
{
if(s1.length()!=s2.length())
return false;
else
{
bool b=true;
string::const_iterator i,j;
for(i=s1.begin(), j=s2.begin(); b && i!=s1.end();++i,++j)
{
if((isalpha(*i) && isalpha(*j)) && (toupper(*i)!=toupper(*j)))
b=false;
else if((isalpha(*i) && !isalpha(*j)) || (!isalpha(*i) && isalpha(*j)))
b=false;
else if((!isalpha(*i) && !isalpha(*j)) && *i!=*j)
b=false;
}
return b;
}
}
};
int main()
{
try
{
map<string,string,cmp_ins> db;
string name,MT;
string::iterator j;
ifstream fdb("MIME.dat"), fn("names.dat");
if(!fdb.is_open())
throw runtime_error("Couldn't open MIME.dat");
if(!fn.is_open())
throw runtime_error("Couldn't open names.dat");
struct cmp_ins obj;//Will be used to verify if cmp_ins works correctly
while(fdb >> name >> MT)
{
db[name]=MT;
cout << "(" << name << "," << MT << ")" << endl;
}
cout << endl;
fdb.close();
while(fn >> name)
{
cout << "name:" << name << endl;
for(j=name.end();*j!='.' && j!=name.begin();--j);
if(*j!='.')
cout << "UNKNOWN" << endl;
else
{
string ac=name.substr(j-name.begin()+1,name.end()-j);
cout << ac << "=gif? " << obj(ac,string("gif")) << endl;
map<string,string,cmp_ins>::iterator t=db.find(ac);
cout << "MIME: ";
if(t==db.end())
cout << "UNKNOWN" << endl;
else
cout << t->second << endl;
}
cout << endl;
}
fn.close();
return EXIT_SUCCESS;
}
catch(exception& e)
{
cerr << e.what() << endl;
return EXIT_FAILURE;
}
}
这是输出:
(html,text/html)
(png,image/png)
(gif,image/gif)
name:animated.gIf
gIf=gif? 1
MIME: image/gif
name:portrait.png
png=gif? 0
MIME: image/gif
name:index.html
html=gif? 0
MIME: UNKNOWN
如您所见,该计划考虑&#34; portrait.png&#34;作为一个image / gif文件,当png!= gif时,函数cmp_ins能够分辨出它(它返回0)。此外,该程序无法识别&#34; index.html&#34;的类型。
你能告诉我出了什么问题吗?
答案 0 :(得分:2)
要使比较器与std::map
一起使用,它必须满足Compare概念:
当上下文转换为bool时,应用于Compare类型的对象的函数调用操作的返回值,如果调用的第一个参数出现在此Compare类型引发的严格弱排序关系中的第二个参数之前,则返回true,否则就是假的。
如果对象相等,你的比较器似乎返回true,这不是这个概念所要求的。您需要重写它以满足严格的弱排序关系&#34;