我有一个程序,它接收DNA字符串的文本文件,将它们分成kmer子字符串并计算弹出一个唯一子字符串的次数。我唯一的问题是让它识别字符串值" N"并在文件中忽略它...例如像这样的文本文件:
3 3
ACNTG
ACTG
ACTG
会将dna序列分成3个kmers,因此是第一个整数。问题是我想忽略N并继续前进而不在唯一字符串值中包含N.所以输出将是......
ACT,CTG,TGA ......等等忽略N值。这是我的代码部分,我相信该部分应该包含在:
#include <fstream>
#include <iostream>
#include <string>
#include <unordered_map>
std::string kmer = "";
std::unordered_map<std::string, int > dna;
for(int i = 0; i< s.length() ; ++i){
int z= 0;
kmer = s.substr(z,k);
++z;
if (kmer.length() != k){
break;
}
//DONT UNDERSTAND WHY THIS WOULDNT WORK
if(!dna.find("N")) !=std::string::npos)){
dna[kmer]++;
}
}
for (std::unordered_map<std::string,int>::iterator it=dna.begin(); it!=dna.end(); ++it){
std::cout << it->first << " " << it->second << std::endl;
}
f.close();
return 0;
}
答案 0 :(得分:1)
好像你在行中有一个错误
if(!dna.find("N")) !=std::string::npos)){
你可能意味着
if(kmer.find('N') !=std::string::npos){
后一个(我认为是你的意思),使用std::string::find
检查字符'N'
中字符kmer
的位置。这具有逻辑意义(您正在检查kmer是否包含错误的N),并且返回值确实可以与std::string::npos
进行比较。
前一个(除了Ap31注意到的前面额外!
的拼写错误),使用"N"
中的unordered_map
检查字符串std::string::npos
的位置std::unordered_map
。这没有逻辑意义(你可能不会使用1-mers),并且返回值无法与{{1}}进行比较。