最近開始學習資料結構與演算法了,使用的是weiss的資料結構與演算法c++描述,第三版和第四版。
其中第四版已經全部用c++11的標準重寫了。
感覺我自己寫的時候有點糾結到底用c++老的標準還是c++11的標準,哈哈,選擇困難!
今天我主要用c++老的標準寫了vector類,因此沒有實現移動建構函式和移動拷貝函式。但是裡面使用了c++11中的auto和nullptr這兩個東西,auto確實很方便。
記錄一下今天的**:
首先是vector.h檔案,裡面定義了vector類模板:
#ifndef my_vector_h
#define my_vector_h
#include//因為程式中使用了nothrow new
#includetemplate class vector; //為vector類保留初始化的容量————常量
typedef object * iterator; //普通迭代器
typedef const object * const_iterator; //常迭代器
// 提供的函式
public:
// 建構函式 + 預設建構函式(使用explicit防止隱式轉換)
explicit vector(int initsize = 0)
:m_thesize(initsize),
m_thecapacity(m_thesize + spare_capacity),
m_po(nullptr) //指標直接初始化為nullptr }
// 拷貝建構函式
vector(const vector & rhs)
:m_thesize(rhs.m_thesize),
m_thecapacity(rhs.m_thecapacity),
m_po(nullptr)
for (unsigned int i = 0; i < rhs.m_thesize; ++i)
}//過載賦值操作符
const vector& operator=(const vector & rhs)
// 賦值到新的記憶體
for (unsigned int i = 0; i < rhs.m_thesize; ++i)
// 釋放原物件記憶體
delete this->m_po;
this->m_po = p_tmp; // 接管記憶體
this->m_thesize = rhs.m_thesize;
this->m_thecapacity = rhs.m_thecapacity;
} return *this;
} // 析構函式
~vector()
// resize函式用來改變vector的size
void resize(unsigned int newsize)
// reserve函式用來改變vector的capacity
void reverse(unsigned int newcapacity)
for (unsigned int i = 0; i < m_thesize; ++i)
delete m_po;
this->m_po = p_tmpnew;
this->m_thecapacity = newcapacity;
} // 過載操作符(包含兩種)
// 1、對於常物件使用的
const object& operator (unsigned int index) const
return this->m_po[index];
} // 2、非常物件使用的, 使用1中的**,減少冗餘
object & operator (unsigned int index)
// 判斷vector物件內部是否為空
bool empty() const
// 獲得vector物件的含有元素的個數
unsigned int size() const
// 獲得vector物件的總容量
unsigned int capacity() const
// 在vector物件的尾部插入元素
void push_back(const object &tmp)
m_po[m_thesize++] = tmp;
} // 刪除vector最後的乙個元素
void pop_back()
else
} // 返回最後乙個元素的值
const object & back() const
else
}// 實現begin函式,返回指向第乙個元素的迭代器
iterator begin()
const_iterator begin() const
// 實現end函式,返回指向最後乙個元素之後的位置的迭代器
iterator end()
const_iterator end() const
private: //注意宣告的順序,因為建構函式中賦值按此順序
unsigned int m_thesize;
unsigned int m_thecapacity;
object *m_po;
};#endif
下面是測試**:demotest.cpp
#include#include// 使用了copy函式
#include// 使用了ostream_iterator
#include// 使用了sleep函式
#include"vector.h"
using namespace std;
int main()
cout << "----------vector已經清空--------------------" << endl;
sleep(1000);
cout << "----------測試resize和reverse函式-----------" << endl;
auto tmp_size = myvec.size();
auto tmp_capacity = myvec.capacity();
for (int i = 0; i < 50; i++)
myvec.push_back(i);
if (tmp_capacity != myvec.capacity())//(tmp_size != myvec.size()) || (
} cout << "------現在vector中的內容------" << endl;
copy(myvec.begin(), myvec.end(), ostream_iterator(cout, " "));
cout << endl;
return 0;
}
執行結果:
執行平台:windows10+vs2013
C 模式實現vector
include include include using namespace std namespace my vector 2.c 11構造 以列表初始化 比如乙個array,乙個list vector initializer list il start nullptr finish nullp...
C 簡單實現vector
向量是序列容器,表示可以更改大小的陣列。就像陣列一樣,向量對其元素使用連續的儲存位置,這意味著也可以使用指向其元素的常規指標上的偏移量來訪問其元素,並且與陣列一樣高效。但與陣列不同的是,它們的大小可以動態變化,它們的儲存由容器自動處理。在內部,向量使用動態分配的陣列來儲存其元素。可能需要重新分配此陣...
C 何時使用vector
vector是stl裡面的標準模板,簡單的說就是乙個變長陣列。在使用vector的時候,有時能帶來程式設計上的方便,但是如果使用不當,則會帶來一些麻煩或者隱藏一些錯誤。任何系統都不會允許資料無限增加。任何資料要麼有乙個明確的最大數量,要麼有乙個隱性的的最大數量。如果需要存放的元素有乙個不太大的最大值...