std::vector可以根據T的類型,自動存儲好一個列表,並有如push_back()等的接口,也重載了[],比如可以vec[0]就可以得到值,當然還有iterator 的部分;這邊僅實現push_back()和[],來做一個簡單的實現,抛磚引玉;
.h
template<typename T>
class MyVector
{
private:
struct MyVector_Node
{
T* node;
MyVector_Node* next;
};
public:
MyVector_Node& operator [](unsigned int index) {
return *(MyVector_Node*)index_ptr[index];
}
void push_back(T data)
{
if (size_ == 0)
{
MyVector_Node* node = new MyVector_Node();
node->node = new T(data);
node->next = nullptr;
vec_head_ = node;
size_++;
index_ptr[size_ - 1] = (int)node;
return;
}
MyVector_Node* node = new MyVector_Node();
node->node = new T(data);
node->next = nullptr;
MyVector_Node* p_node = vec_head_;
for (int i = 1; i < size_; i++)
{
p_node = p_node->next;
}
p_node->next = node;
size_++;
index_ptr[size_ - 1] = (int)node;
}
int size()
{
return size_;
}
private:
MyVector_Node* vec_head_;
int size_=0;
int index_ptr[10000];
};
class Test_MyVector
{
public:
Test_MyVector(int i) :id(i) {}
int Get_Id() { return id; }
private:
int id;
};
main中測試
MyVector<Test_MyVector> vec_myvec;
//vec_myvec.push_back(Test_MyVector(1));
for (int i = 0; i < 10; i++)
{
vec_myvec.push_back(Test_MyVector(i));
}
for (int i=0;i<vec_myvec.size();i++)
{
std::cout << vec_myvec[i].node->Get_Id() << std::endl;
}
運行的結果:
感想:讓我想起大學的時候學習c語言的時候,實現list的情景;這裏爲了方便查找用了一個數組用來寸index和pointer,作爲一個簡單的hash表;每次push_back()一個元素,就new一個元素,加到鏈表的尾部;其他的功能都可以用類似的方式實現;