2016-09-25 52 views
0

我有一個程序,它接受DNA字符串的文本文件,將它們分成kmer子字符串並計算唯一子字符串彈出多少次。我唯一的問題是有它識別字符串值「N」,並在文件中忽略它...例如文本文件,像這樣:如何忽略無序地圖/地圖中的單個字符串值?

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

好像你中有個錯誤

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

你可能意味着它是

if(kmer.find('N') !=std::string::npos){ 
  • 後一個(我認爲是你的意思),檢查字符的位置在字符串kmer使用std::string::find。這是合乎邏輯的(您正在檢查kmer是否包含錯誤的N),並且返回值的確可以與std::string::npos進行比較。

  • 前者(從哪個Ap31注意到前的額外!一個錯字疊氮化),對於串"N"unordered_map使用std::unordered_map位置檢查。這並不合邏輯(你可能不適用於1-mers),並且返回值不能與std::string::npos進行比較。

+0

你是怎麼設法解析條件中第一個'!'的? :D +1 它讓我很困惑。此外,這些字符串是乞求一些用戶定義的散列 – Ap31

+1

@ Ap31我剛剛得到了你所提出的觀點。謝謝!直到你提出它,我只是沒有看到它。短視有時會帶來回報:-) –

+1

好吧,你仍然能夠給出正確的答案,而我甚至不知道這個表達式應該是什麼意思。我不得不說,雖然括號仍不能完全補充你的當前解決方案:D – Ap31

相關問題