元素空间STL学习笔记(九) 序列式容器 vector
PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘。目前又不当COO,还是得用心记代码哦!
vector 的个性:
vector 除了可以应用标准容器共性 和序列式容器共性外 还可以应用如下函数:
当前容量 .capacity(),用于事后分配数组空间,以免多次重新分配空间和复制 // 共性中的.size()表示元素个数
约定容量 .reserve(n)
(1)下标 .operator[ ]( i ) 不检查越界 (2) .at( i ) 会先检查越界,越界抛出异常
(注意:不支持前插,插入仅能应用push_back 和 insert)
vector 例子
#include <iostream> using namespace std; #include <vector> #include "show.h" #include <typeinfo> #include <exception> template <typename T> void print(const vector<vector<T> > &v) //打印二维数组 { cout << "--------print-------------" << endl; for(int i=0; i <v.size(); i++) { for(int j=0; j < v.at(i).size(); j++) { cout << v.at(i).at(j) << ' '; } cout << endl; } cout << "------------------------" << endl; } int main() { vector<double> vd,vv,vi; cout << vd.size() << '/' << vd.capacity() << endl; cout << "----------------------" << endl; for(int i = 0; i< 9; i++) { vd.push_back(i+0.1); cout << vd.size() << '/' << vd.capacity() << endl; } /* 结果表现: 0/0 ---------------------- 1/1 2/2 3/4 4/4 5/8 6/8 7/8 8/8 9/16 */ vv.reserve(9); //如果有大量数据要插入,可以先把空间预留好,以免反复分配空间和复制数据 cout << vv.size() << '/' << vv.capacity() << endl; cout << "----------------------" << endl; for(int i = 0; i< 10; i++) { vv.push_back(i+0.1); cout << vv.size() << '/' << vv.capacity() << endl; } /* 0/9 ---------------------- 1/9 2/9 3/9 4/9 5/9 6/9 7/9 8/9 9/9 10/18 */ /*vector迭代器重新分配内存后 ,迭代器会失效 所以插入和删除数据后,迭代器要重新去取得*/ cout << "----------------------" << endl; for(int i = 0; i< 10; i++) { vi.push_back(i+0.1); cout << &*vi.begin() << ": " ; cout << vi.size() << '/' << vi.capacity() << endl; } /* * 你会发明重新分配内存后 开始位置会变化 0x8886008: 1/1 0x8886018: 2/2 0x8886030: 3/4 0x8886030: 4/4 0x8886058: 5/8 0x8886058: 6/8 0x8886058: 7/8 0x8886058: 8/8 0x8886210: 9/16 0x8886210: 10/16 */ /*拜访元素的值*/ //不做越界检查的 [ ] for(int i=0; i< vi.size(); i++) { cout << vi[i] << ' '; } cout << endl; //做越界检查的拜访 at 越界抛出std::out_of_range try { for(int i=0; i<= vi.size(); i++) { cout << vi.at(i) << ' '; } cout << endl; } catch(exception &e) { cout << "异常:" << e.what() << endl; //vector::_M_range_check cout << "类型:" << typeid(e).name() << endl;// St12out_of_range } //修改数据 vi[1] = 123.45; vi.at(2) = 67.8; show(vi.begin(), vi.end()); //0.1 123.45 67.8 3.1 4.1 5.1 6.1 7.1 8.1 9.1 //序列式容器特有的构造函数 vector<int> vtest(3,4); //3个4 cout << vtest.size() << '/' << vtest.capacity() << endl; // 3/3 show(vtest.begin(), vtest.end());// 4 4 4 vector<int> vtest2(3); //3个0 cout << vtest2.size() << '/' << vtest2.capacity() << endl; // 3/3 show(vtest2.begin(), vtest2.end());// 0 0 0 /*二位数组*/ int m=3,n=5; // 空格离隔尖括号 否则报错 error: ‘>>’ should be ‘> >’ within a nested template argument list vector<vector<int> > vvi(m,vector<int>(n)); //m个vector元素,每一个vector含5个0 print(vvi); /* 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 */ vvi.resize(m+3);//修改元素个数为6个 ,新增的元素是空构造函数 vvi[1].assign(9,1);//将第二个元素设置为9个1 vvi[5].assign(11,1);//将第六个元素设置为11个1 //cout << "-----------" << endl; /* for(int i=0;i <m+3;i++) { show(vvi[i].begin(),vvi[i].end()); } */ print(vvi); /* 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 */ }
文章结束给大家分享下程序员的一些笑话语录:
程序员的愿望
有一天一个程序员见到了上帝.上帝: 小伙子,我可以满足你一个愿望.程序员: 我希望中国国家队能再次打进世界杯.
上帝: 这个啊!这个不好办啊,你还说下一个吧!
程序员: 那好!我的下一个愿望是每天都能休息6个小时以上.
上帝: 还是让中国国家打进世界杯.