-
头文件
-
#include <vector>
-
-
// vector 是 c++ 98中引入的动态数组
namespace std {
template<typename T,typename Allocator = allocator<T>>
class vector;
}
// 特点随机访问元素,末端添加删除元素,效率高,前嵯和中间删除和添加元素效率低,
// 存在当前空器大小和容量的关系
using Group = std::vector<float>;
// 多种初始化
Group a;
Group b = a;
Group c = {};// 空初化
Group d(a);
Group e(10);参数1为int时,则是申请多少个int的空间
Group f(10,1.0f);// 申请10个元素,每个元素的值均为1.0f
Group g(a.begin(),a.end());// 迭代器从头赋到尾
Group h({1.0,2.0,3.0});// 初始化三个元素
Group j = {1.0,2.0,3.0};// c++ 11 特有的用法
d.empty() //是否为空 实现 return b.size() == 0;
d.size();// 元素的数量
d.max_size();// 一般用不着,只有大公司才考虑这个
d.capacity();// 返回容器当前能够容纳的元素数量
d.reserve( 100 ); // 新元素还没有构造, 上面的得用push_back,或插入初始
d.resize(102);// d[101],d[102];// 申请了,可以马上用,
d.clear(); // 将里面的元素清0,但只是清了,但大小可能是不变的,需要调用下面的来清理
d.shrink_to_fit();// 真正的正确清空数据和释放内存// 赋值
b = g;
b.assign(3,1.0f);// 重新分配,并重置为 {1.0,1.0,1.0};
b.assign(g.begin(),g.end());
b.assign({1.0,1.0,1.0});
// 交互
swap()// 类似实现的类型,
struct A {
int * data;
void swap(A &rhs){
int * temp = rhs.data;
rhs.data = data;
data = temp;
}
}
b.swap(a);// vector
std::swap(a,b);
// 元素的访问
b[0];// 不存在的话,会异常
b.at(0);
b.front();// 不能直接用 需要判断 if !b.empty() { b.front(); }
b.back();// 迭代器相关
a.begin();
a.end()
a.cbegin();不可修改的
a.cend()
a.rbegin();倒转循环
a.rend();
a.crbegin()
a.crend();a.pop_back();// 同样要判断是否为空,否则可能是错误
if !a.empty() then a.pop_back(); // 单线程没毛病,但多线程,可能会出错,后面的新增的贴子会有讲解b.erase(b.begin())// 删除
-
auto iterAfter = b.earase(b.begin());// 返回新的位置,一般for循环,比如
struct _vec
{
bool b;
int c;
_vec()
{
b = false;
c = 0;
}
};
std::vector<_vec> vec;
for (auto it = vec.begin();it != vec.end();)
{
if (it->b)
{
it = vec.erase(it);// 条件删除,需要取回他的it最新的位置,全删除完,则返回 vec.end()
}
else
{
++it;
}
}
-
b.erase(b.begin(),b.end()) // 效果相当 b.clear() 区间删除.后面的元素会依次向上移动
// 插入
b.push_back(10.0f);
auto iter = b.insert(b.end(),100.0f) // 会返回当前插入数据的位置
iter = b.insert(b.end(),10,100.0f);// 在最后插入10个这样子的元素
b.insert(b.end(),f.begin(),f.end());
b.emplace(b.end(),10.0f); // emplace_back只调用构造函数,没有移动构造函数,也没有拷贝构造函数。 以后可以使用 emplace_back 代替 push_back
b.emplace_back(10.0f)// 清空 重置
b.resize(10);
b.resize(10,1.0f);// 重置为10个元素,值为1.0;
b.clear()
b.shink_to_fit();// 和C的接口调互
sd::vector<char> carr(100,0);
strcpy(&carr[0],"hello world\n");
printf("%s",&carr[0]);
// 错误用法
printf("%s",carr.begin()); -
// 总结:
-
vecter 除开array 以外,是占用空间是最少的!!!