如何忽略无序地图/地图中的单个字符串值?

时间:2016-09-25 19:17:04

标签: c++ c++11 unordered-map

我有一个程序,它接收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;
}

1 个答案:

答案 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}}进行比较。