c++98 stl-vector

shangs00 2020-02-24

#include <vector>
#include <iostream>
#include <cstring>
//#include <memory>
//c++ 98

static void vectorPart() {
//vector 是c++98中引入的动态数组(dynamic array)
//namespace std {
//template<typename T, typename Allocator = allocator<T>> //就是用默认的alloctor了,
//  class vector;
//}
//特点随机访问元素, 末端添加删除元素效率最高, 前端和中间删除和添加元素效率最低,
//存在当前容器大小和容量的关系
using Group = std::vector<float>;

Group a;
Group b = a; //拷贝构造
Group c(a); //拷贝构造
Group d(10); //定义容量的大小
Group e(10, 1.0f); //10个初始化为1.0
Group f(e.begin(), e.end()); //传入两个迭代器,中间的所有值都会被拷贝
Group g({1.0f, 2.0f, 3.0f}); //c++11, 把写好的元素直接填
Group h = {1.1f, 2.1f, 3.1f};
Group i {1.2f, 2.2f, 3.2f, 4.2f}; //initialize list

d.empty();
d.size(); //当前的大小
d.max_size(); //max_size()相对于其他容器的要小一些
d.capacity(); //最多能在装入多少个元素,前提没有分配内存的情况下.
d.reserve(100); //预先分配100个内存空间
d.shrink_to_fit(); //c++11 

//operator == != < > <= >=

//赋值
b = g;
b.assign(3, 1.0f); //代表重新分配元素为: {1.0f, 1.0f, 1.0f}
b.assign(g.begin(), g.end());
b.assign({1.0f, 2.0f, 3.0f});

//交换: 交换给vector类中的指针,效率比较高
b.swap(a);
std::swap(a, b); 

//元素访问:
b[0];
b.at(0); //越界抛出异常: std::out_of_range
if(b.empty()) {
    b.front(); //一定要检查, 不然会出现错误, undefined
    b.back();

}
b.front();
b.back();

//迭代器相关:
a.begin();
a.end();
a.cbegin();
a.cend();
a.rbegin();
a.rend();
a.crbegin();
a.crend();

//
//去除最后一个元素
//signal thread OK, multthread maybe wrong
a.pop_back(); //maybe wrong

//删除某个特定位置的元素
b.erase(b.begin()); //删除掉迭代器当前位置的元素, 而后面的元素会往前移动, 返回下一个元素的位置
b.erase(b.begin(), b.end()); //删除掉迭代器中间元素
//要检查迭代器是否失效

b.push_back(10.0f); //尾部插入元素
b.pop_back(); //获取尾部元素,且释放

//在某个位置插入元素
//在尾部插入100.0
auto iter = b.insert(b.end(), 100.0f); //返回插入元素所在的迭代器
iter = b.insert(b.end(), 10, -10.0f); //在尾部插入10个 -10.0f
b.insert(b.end(), h.begin(), h.end()); //在尾部插入 两个迭代器之间的元素

b.emplace(b.end(), 10.0f); //c++11
b.emplace_back(10.0f); //c++11  && move copy 右值 拷贝

b.resize(10); //设置vector的大小
// 若改变小了,就会调用元素相应的析构
b.resize(100, 1.0f); //把vector的大小设置为100,若元素个数不足100,以值为:1.0来填充到100
b.clear(); //注意: 并不会让以前所占的内存降低, 只是可以把空间腾出来
b.shrink_to_fit(); //c++11, 降低内存到合适的大小

//和C的接口互用
std::vector<char> carr(100, 0);
strcpy(&carr[0], "hello World\n"); //最好用 carr.data();
printf("%s", carr.data());
//错误用法:
printf("%s", carr.begin());

//异常:
//1. push_back
//2. 元素 move / copy 没有异常的话
//insert
//emplact
//emplce_back
//push_bakc
//pop_back
//erase
//swap
//clear 都不会有异常

//特殊:
//标准化的失误:  不要使用,std::vector<bool>
}
int main(int, char**) {

    return 0;
}

相关推荐