gpt4 book ai didi

c++ - map 给出错误的值

转载 作者:行者123 更新时间:2023-11-28 01:49:25 24 4
gpt4 key购买 nike

CodinGame 中的一个谜题中称为 MIME Type ,我们被要求制作一个程序:

  • 获取扩展名及其相应 MIME 类型的数据库。
  • 读取多个文件名。
  • 打印每个文件对应的 MIME 类型。如果数据库中不存在文件的扩展名,则应该打印 UNKNOWN。
  • 以不区分大小写的方式检测扩展。例如,如果我们知道 MIME 类型 image/png,无论扩展名如何出现在文件名中(“pic.png”或“pic.PNG”或“pic.PnG”),程序都应该能够分辨它的 MIME 类型是 image/png

我能够解决这个难题。我在这里展示的第一次尝试更为复杂。但是,我将它发布在这个问题中,因为我有一个奇怪的错误,我无法弄清楚它背后的原因是什么。

考虑以下包含扩展名及其相应 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

如您所见,程序将“portrait.png”视为图像/gif 文件,而 png!= gif,并且函数 cmp_ins 能够区分(它返回 0)。此外,该程序无法识别“index.html”的类型。

你能告诉我哪里出了问题吗?

最佳答案

对于要与 std::map 一起使用的比较器,它必须满足 Compare理念:

The return value of the function call operation applied to an object of type Compare, when contextually converted to bool, yields true if the first argument of the call appears before the second in the strict weak ordering relation induced by this Compare type, and false otherwise.

如果对象相等,您的比较器似乎会返回 true,这不是这个概念所要求的。您需要重写它以满足“严格的弱排序关系”

关于c++ - map 给出错误的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43618651/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com