2016-09-25 3 views
0

私は、DNA文字列のテキストファイルを取り込み、それらをkmerサブストリングに分割し、一意のサブストリングが何回ポップアップするかを数えるプログラムを持っています。私の唯一の問題は、そのようなテキストファイル、たとえば...それは文字列値「N」を認識し、ファイルにそれを無視したします順序付けられていないマップ/マップで単一の文字列値を無視する方法はありますか?

ACNTG

ACTG

ACTG

は、dna配列を3kmに分割し、したがって第1の整数に分割する。問題は、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

それはそうあなたはおそらくそれを意味

if(!dna.find("N")) !=std::string::npos)){ 

がためには、

if(kmer.find('N') !=std::string::npos){ 
  • 後者(私が思ったものだと思います)は、文字の位置を確認します'N'の文字列kmerstd::string::findです。これは論理的な意味を持ちます(kmerにNが含まれているかどうかをチェックしています)、戻り値は実際にstd::string::nposと比較できます。

  • 前者(AP31が気づい前面に余分!の誤植からasides)、std::unordered_mapを用いunordered_map文字列"N"の位置をチェック。これは理にかなっていません(あなたはおそらく1-merで作業していません)。戻り値はstd::string::nposと比較できません。

+0

どのようにして、最初の '!'を条件で解析することさえできましたか? :D +1 それはかなり私を困惑させた。また、これらの文字列は、ユーザー定義のハッシュを求めています。 – Ap31

+1

@ Ap31ありがとう!あなたがそれを提起するまで、私はそれを見たことがありませんでした。 Shortsightednessは時々報われます:-) –

+1

あなたはまだ正しい答えを出すことができましたが、私はこの表現が何を意味するのか理解できませんでした。私は、ブラケットはあなたの現在の解決策ではまだ結構ではないが、D – Ap31

関連する問題