class//DNA

Nucleotide組成的DNA,用vector串起每一個Nucleotide,就成為我們這一次量測時,會量測的項目了。
例如:
白色9點+黑色9點+紅色1點+綠色1點+藍色1點

重新包裝vector,讓DNA的操作還擁有vector的功能,這一點在DNA看不到什麼特別之處,但是在RNA的設計上,就大有不同了。

為什麼不用繼承?
因為繼承一個Template是一件複雜而難以掌握的事。
沒有必要使用template因為這件作品使用的資料型別是固定的,並不像vector一樣要吃各種的類別做操作。

最特別的是其中一個複雜的DelCell(),去除相同的元素。這是一個沒有STL的功能,我用了笨的方法實作,在此也介紹一下。

在AddCell的overload上,其實實作上也是使用不同的作法,而我把它們包成相同介面。

DNA.h

#ifndef DNA_H
#define DNA_H

#include "Nucleotide.h"

class DNA
{
 std::vector<Nucleotide> nChain;
public:
 void AddCell(const Nucleotide& _N);
 void AddCell(ColorType _C = NoColor, PointTotal _P = NoPn, int _N1 = -1, int _N2 = -1, int _N3 = -1);
 void AddCell(const DNA&);

 void DelCell(std::vector<Nucleotide>::size_type index);
 void DelCell(const DNA& );
public:
 std::vector<Nucleotide>::iterator       Begin()       { return nChain.begin(); };
 std::vector<Nucleotide>::const_iterator Begin() const { return nChain.begin(); };

 std::vector<Nucleotide>::iterator       End  ()       { return nChain.end();   };
 std::vector<Nucleotide>::const_iterator End  () const { return nChain.end();   };

 std::vector<Nucleotide>::size_type      Size () const { return nChain.size();  };
 void Empty(){ nChain.clear(); };

 void operator+(const Nucleotide&  _X);
 void operator+(const DNA& _R);
};

#endif

DNA.cpp

去compData裡擁有的相同元素

因為STL沒有這個功能而創造出來的
它是為了要去除掉量測重覆的點,有時需要修改特定量測項目,則需要新的元素來取代已有值的元素。
void DNA::DelCell(const DNA& compData)
{
    if (compData.Size())//裡面這些不要修改,影響再次量測的資料擺放
    {
        std::vector<Nucleotide>::const_iterator dnaItor = 0, compItor;
        std::vector<Nucleotide>::iterator rmBeginItor(End());

        for (compItor = compData.Begin(); compItor != compData.End(); ++compItor)
                rmBeginItor = std::remove(Begin(), rmBeginItor, *compItor);
        
        nChain.erase(rmBeginItor, End());
    }
}

加加減減的操作

加加減減的操作,在人腦裡總是使用相同的符號在做運算,但是vector提供有好多種不同的介面,為了降低複雜度,所以將它們包成相同的介面。
void DNA::AddCell(const Nucleotide& _N) 
{
    nChain.push_back(_N);
}

void DNA::AddCell(ColorType _C, PointTotal _P, int _N1, int _N2, int _N3)
{
    Nucleotide _N(_C, _P, _N1, _N2, _N3);
    nChain.push_back(_N);
}

void DNA::AddCell(const DNA& _D)
{
    nChain.insert(End(), _D.Begin(), _D.End());
}

void DNA::DelCell(std::vector<Nucleotide>::size_type index)
{
    nChain.erase(&nChain.at(index));
}

文章分類維度