2.vector深度剖析及模擬實現
2.1std::vector的核心框架接口的模擬實現bit::vector
vector的模擬實現
2.2 使用memcpy拷貝問題
假設模擬實現的vector中的reserve接口中,使用memcpy進行的拷貝,以下代碼會發生什么問題?
int main()
{gxl::vector<bite::string> v;v.push_back("1111");v.push_back("2222");v.push_back("3333");return 0;
}
問題分析:
- memcpy是內存的二進制格式拷貝,將一段內存空間中內容原封不動的拷貝到另外一段內存空間中
- 如果拷貝的是自定義類型的元素,memcpy既高效又不會出錯,但如果拷貝的是自定義類型 元素,并且自定義類型元素中涉及到資源管理時,就會出錯,因為memcpy的拷貝實際是淺拷貝。
結論:如果對象中涉及到資源管理時,千萬不能使用memcpy進行對象之間的拷貝,因為 memcpy是淺拷貝,否則可能會引起內存泄漏甚至程序崩潰。
2.3動態二維數組理解
// 以楊慧三角的前n行為例:假設n為5
void test2vector(size_t n)
{// 使用vector定義二維數組vv,vv中的每個元素都是vector<int>gxl::vector<bit::vector<int>> vv(n);// 將二維數組每一行中的vecotr<int>中的元素全部設置為1for (size_t i = 0; i < n; ++i)vv[i].resize(i + 1, 1);// 給楊慧三角出第一列和對角線的所有元素賦值for (int i = 2; i < n; ++i){for (int j = 1; j < i; ++j){vv[i][j] = vv[i - 1][j] + vv[i - 1][j - 1];}}}
gxl::vector> vv(n); 構造一個vv動態二維數組,vv中總共有n個元素,每個元素 都是vector類型的,每行沒有包含任何元素,如果n為5時如下所示:
vv中元素填充完成之后,如下圖所示:
使用標準庫中vector構建動態二維數組時與上圖實際是一致的。