例如:
白色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));
}