gpt4 book ai didi

c++ - 将值插入到 vector 的映射中

转载 作者:太空宇宙 更新时间:2023-11-04 14:24:34 25 4
gpt4 key购买 nike

我正在为学校的 CIS 算法分析类(class)编写程序,我在理解实现方面遇到了一些困难,就如何将我从输入文件解析的数据插入到值是类型 vector 的映射中条目是一个包含页码和范围的结构。我已经阅读了几个小时,但我似乎无法正确理解语法。

输入文件的前3行如下:

IX: {系列|(} {2}九:{系列!几何|(} {4}IX: {欧拉常数} {4}

基本上,我正在解析一本书的索引,当我打印出 map 时,它应该列出所有标题/子标题的标题和页面范围。

#include <fstream>
#include <iostream>
#include <vector>
#include <string>
#include <map>

using namespace std;

#define START 0
#define END -1

struct Cmp_Insen
{
bool operator()(const string &lhs, const string &rhs) const
{
return stricmp(lhs.c_str(), rhs.c_str()) < 0;
}
};

struct Entry
{
int pageNum;
int type;
};

int main( int argc, char *argv[] )
{
string inputstring, ent_nam_substring, pag_num_substring, page_number;
int ent_nam_str, ent_nam_end, pag_num_str, pag_num_end;
vector<Entry> page_range;

if( argc < 2)
return 0;
else
{
ifstream the_file ( argv[1] );
if( !the_file )
cerr<<"Could not open file!\n";
else
{

map<string,vector<Entry>,Cmp_Insen> mIndex;
//map<string,vector<Entry>,Cmp_Insen>::const_iterator iter;
//for(iter = mIndex.begin(); iter != mIndex.end(); ++iter)


while( !the_file.eof() )
{
getline( the_file, inputstring ); // Extract Entry Heading Start
ent_nam_str = inputstring.find("{");
ent_nam_end = inputstring.find("}");
ent_nam_substring = inputstring.substr(ent_nam_str + 1, ent_nam_end - (ent_nam_str + 1)); // Extract Entry Heading End


pag_num_substring = inputstring.substr(ent_nam_end + 1, inputstring.length() - ent_nam_substring.length()); // Extract Page Number Start
pag_num_str = pag_num_substring.find("{");
pag_num_end = pag_num_substring.find("}");
page_number = pag_num_substring.substr(pag_num_str + 1, pag_num_end - (pag_num_str + 1)); // Extract Page Number End


}
}
}
return 0;

当第一行输入完成处理时 page_Number = '2';和 ent_nam_substring = "系列|("

在 map 中,“系列”是这一行的键,“|(”表示从第 2 页开始的该标题的页面范围的开始。我需要做的是扫描每一行输入并插入一个key 如果不存在,如果不存在,则将下一个页码推送到与该键关联的 vector 上,直到到达“|)”,表示该标题的页面范围结束。

我的另一个相关问题是,如果我正在进行不区分大小写的比较,以便 map 在我的键上保持有序,我是否必须每次都显式调用比较,或者一旦它在 map 声明中定义和声明将 map 只是在执行插入等操作时使用它?

对于我因缺乏知识而造成的任何困惑,我们深表歉意,任何有帮助的反馈将不胜感激,因为我的两本教科书没有为我提供我正在寻找的答案。

最佳答案

定义比较运算符后, map 会自动自行处理它的使用。您不必调用它。

顺便说一句,stricmp 不可移植。在 Unux 上你可能需要 strcasecmp。这应该可以解决问题:

#ifndef WIN32 
#define stricmp strcasecmp
#endif

关于你的问题的其余部分,你解释了你的代码应该做什么,但你忘了提及它实际上在做什么......

关于c++ - 将值插入到 vector<entry> 的映射中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5130871/

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