c++map容器问题,可能是迭代器失效

xiao_mu_mu xiao_mu_mu 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
主要是发现输出容器中键值,多了一些与if判断标准不相符的值。我第二个程序的逻辑和第一个程序的逻辑是一样的,第二个程序能够输出正确的结果,第二个输出容器中键值,多了一些与if判断标准不相符的值。恳请大家麻烦帮我看看~我想找出原因是哪里~
之前我是用:
contig2read_iter = contig2read.find(contig);
if(contig2read_iter == contig2read.end())
来判断contig是否在容器里面,后来我改成了:
pair<map<string, cr>::iterator, bool> retu = contig2read.insert(make_pair(contig, wc));
来判断insert操作的返回值。这样做的话,结果就是符合预期的。可以麻烦看看么,我想找出哪里出错了,好避免下次不再犯
谢谢大家了~我自己也没搞清到底是哪里出了问题。

我需要解决的问题是:
处理一个文本文件,每一行中有若干个单词(即代码中的变量gi)和一个标志(代码中的变量contig),统计每一行的每一个单词出现的个数(代码中用容器gi_map进行处理)。就是看包含同一个标志(即contig)的行中所有单词出现的个数。若包含contig标志的所有行中都是同一个标志时,则tag == 1,否则tag == 0(不知我说清,还请见谅~)
我用++(contig2read_iter->second.reads);对每一个contig来说,进行总的gi的数目统计。
主要是发现contig2read_iter->second.reads和每一个contig对应值中的容器map<string, int> gi_map;的总数不相等。
所以我定义一个容器contig2read;用来进行操作
typedef struct cr{
string contig;
string gi;
map<string, int> gi_map;
bool tag;
int reads;
float chimerity_rate;
string::size_type length;
}cr;
map<string, cr> contig2read;


之前的版本:
  while(getline(fin_sam, line))
{
if(line[0] == ' ' || line[0] == '\t' || line[0] == '\n' || line[0] == '@')
{
continue;
}
else
{
//cout << line << endl;
i = 0;
tabnum = 0;
//这里主要获得每一行的相关值
while(tabnum < 2) //here tab is "|"
{
if(line[i] == '|')
{
tabnum++;
}
++i;
}
gi.assign(line, 0, i);
//cout << reads << endl;
i = 0;
tabnum = 0;
k = 0;
while(tabnum < 11)
{
if(line[i] == '\t')
{
++tabnum;
if(tabnum == 2)
{
k = i;
}
if(tabnum == 3)
{
contig.assign(line, k + 1, i - k - 1);
if(contig == "*" || contig == "0")
{
break;
}
}
if(tabnum == 5)
{
map_quality.assign(line, i + 1, 1);
if(map_quality == "*" || map_quality == "0")
{
break;
}
}
if(tabnum == 11)
{
unique_tag.assign(line, i + 1, 6);
break;
}
}
++i;
if(i < line.size())
{
continue;
}
else
{
unique_tag.clear();
break;
}
}
if(contig == "*" || contig == "0" || map_quality == "*" || map_quality == "0")
{
unique_tag.clear();
continue;
}
else if(unique_tag == "XT:A:U")
{
//如果满足相关的条件
contig2read_iter = contig2read.find(contig);

if(contig2read_iter == contig2read.end())
{
//看看行中的contig是否已经加入map容器
wc.contig = contig;
wc.tag = 1;
wc.gi = gi;
wc.reads = 1;
wc.gi_map.insert(make_pair(gi, 1));
contig2read.insert(make_pair(contig, wc));
}
else
{
//看看行中的contig是否已经加入map容器
if(1 == contig2read_iter->second.tag)
{
//对gi进行判断,看看是否已经在容器中
if(gi == contig2read_iter->second.gi)
{
++(contig2read_iter->second.reads);
contig2read_iter->second.gi_map_iter = (contig2read_iter->second.gi_map).find(gi);
++(contig2read_iter->second.gi_map_iter->second);
}
else
{
++(contig2read_iter->second.reads);
contig2read_iter->second.gi_map_iter = (contig2read_iter->second.gi_map).find(gi);
if(contig2read_iter->second.gi_map_iter == contig2read_iter->second.gi_map.end())
{
contig2read_iter->second.gi_map.insert(make_pair(gi, 1));
}
else
{
++(contig2read_iter->second.gi_map_iter->second);
}
contig2read_iter->second.tag = 0;
}
}
else
{
++(contig2read_iter->second.reads);
contig2read_iter->second.gi_map_iter = (contig2read_iter->second.gi_map).find(gi);
if(contig2read_iter->second.gi_map_iter == contig2read_iter->second.gi_map.end())
{
contig2read_iter->second.gi_map.insert(make_pair(gi, 1));
}
else
{
++(contig2read_iter->second.gi_map_iter->second);
}
}
}
}
else
{
unique_tag.clear();
continue;
}
}
}


之后的版本:
  while(getline(fin_sam, line))
{
if(line[0] == ' ' || line[0] == '\t' || line[0] == '\n' || line[0] == '@')
{
continue;
}
else
{
//cout << line << endl;
i = 0;
tabnum = 0;
while(tabnum < 2) //here tab is "|"
{
if(line[i] == '|')
{
tabnum++;
}
++i;
}
gi.clear();
gi.assign(line, 0, i);
//cout << reads << endl;
i = 0;
tabnum = 0;
k = 0;
while(tabnum < 11)
{
if(line[i] == '\t')
{
++tabnum;
if(tabnum == 2)
{
k = i;
}
if(tabnum == 3)
{
contig.assign(line, k + 1, i - k - 1);
if(contig == "*" || contig == "0")
{
break;
}
}
if(tabnum == 5)
{
map_quality.assign(line, i + 1, 1);
if(map_quality == "*" || map_quality == "0")
{
break;
}
}
if(tabnum == 11)
{
unique_tag.clear();
unique_tag.assign(line, i + 1, 6);
break;
}
}
++i;
if(i < line.size())
{
continue;
}
else
{
unique_tag.clear();
break;
}
}
if(contig == "*" || contig == "0" || map_quality == "*" || map_quality == "0")
{
unique_tag.clear();
continue;
}
else if(unique_tag == "XT:A:U")
{
wc.contig = contig;
wc.tag = true;
wc.gi = gi;
wc.reads = 1;
pair<map<string, cr>::iterator, bool> retu = contig2read.insert(make_pair(contig, wc));
if(retu.second)
{
pair<map<string, int>::iterator, bool> ret = retu.first->second.gi_map.insert(make_pair(gi, 1));
}
else
{
if(retu.first->second.tag == true)
{
++retu.first->second.reads;
pair<map<string, int>::iterator, bool> ret = retu.first->second.gi_map.insert(make_pair(gi, 1));
if(ret.second)
{
retu.first->second.tag = false;
}
else
{
++ret.first->second;
}
}
else
{
++retu.first->second.reads;
pair<map<string, int>::iterator, bool> ret = retu.first->second.gi_map.insert(make_pair(gi, 1));
if(ret.second)
{
continue;
}
else
{
++ret.first->second;
}
}
}
}
else
{
continue;
}
}
}
...全文

相关推荐

评论 13
收藏 已收藏
分享
返回顶部
xiao_mu_mu
C++ 语言 65,214 成员 250,514 内容