std::vector学习
https://www.cnblogs.com/judes/p/10736275.html
https://www.cnblogs.com/judes/p/10498959.html
https://www.cnblogs.com/judes/p/13753516.html
1、删除指定序号的内容
std::vector<int>::iterator it = vec.begin()+10; auto it = vec.erase(it); //cout<<*it;
会返回此迭代
2、获取最后一个数据
auto pIt = vec.rbegin();
auto data = *pIt;
3、删除指定类型数据
for(vector<int>::iterator it=arr.begin(); it!=arr.end(); ){ if(* it == 0) { it = arr.erase(it); } else { ++it; } }
4、存放智能指针的问题
①、vector保存原始指针:vector析构时不会释放指针指向的堆对象
②、vector保存智能指针:vector析构时会释放智能指针所指向的对象,但是如果将所有权转移给其他智能指针则不会释放
#include <QApplication> #include <QDebug> #include <memory> class A { public: A(int a){m_a=a;qDebug()<<"A"<<m_a;} ~A(){qDebug()<<"~A"<<m_a;} void print(){qDebug()<<m_a;} private: int m_a; }; int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow w; w.show(); std::shared_ptr<A> a; { std::vector<std::shared_ptr<A>> data; data.emplace_back(std::make_shared<A>(1));//所有权被转移,不会自动释放 data.emplace_back(std::make_shared<A>(2));//所有权没有转移,会自动释放 a = data.front(); } a->print(); return app.exec(); }
打印:
PS:std::queue同理
5、删除最后一个
vec.pop_back();
6、删除第一个
auto it = vec.begin();
vec.erase(it);
7、获取迭代器序号
auto it1 = vec.begin(); auto it2 = vec.end(); int index = it2-it1;
8、resize和reserve的区别以及性能优化
①、resize(n)
调整容器的长度大小,使其能容纳n个元素,如果n小于容器的当前的size,则删除多出来的元素;否则使用值初始化的元素。
②、 resize(n,t)
多一个参数t,将所有新添加的元素初始化为t。
③、reserver()的用法只有一种,reserve(n),预分配n个元素的存储空间。
resize影响size(),reserve影响capacity(),提高性能的初始化:
1、首先resize(),再使用vec[i],效率最高,但是需要提前知道size大小 2、首先reserve(),再使用push_back(),效率一般,较原生有一定提升。
https://www.cnblogs.com/judes/p/13753516.html
https://blog.csdn.net/qq_37037492/article/details/86568290
注意:resize之后,里面就已经有数据了,如果再push_back,则是追加在resize的数据之后
9、emplace_back()和push_back()
push_back()右值时就会调用构造函数和转移构造函数;
emplace_back()函数向容器中中加入临时对象, 临时对象原地构造,没有赋值或移动的操作。
emplace_back()函数要比push_back()函数要快一倍
同样的道理,可以用emplace代替insert
10、std::vector转QVector
std::vector<int> vec; QVector<int> qvec; //1 qvec = QVector<int>(vec.begin(), vec.end()); //2 会报警告deprecated..建议用上面的 qvec = QVector<int>::fromStdVector(vec);
11、清空
1、vec.clear();//size=0,capacity不变 2、vec.erase 3、vec.swap(vec1);//vec1被完全释放,内存转移给vec
12、数组转vector
int arr[] = {1,2,3,4,5}; vector<int> varr(arr, arr+5);
13、vector转数组
float *buffer = new float[sizeof(n)]; if (!vecHeight.empty()) { memcpy(buffer, &vecHeight[0], vecHeight.size()*sizeof(float)); }
14、将一个vector的内容复制到另一个的结尾
vector<int>a = { 1,2,3 }; vector<int>b = { 4,5 }; a.insert(a.end(), b.begin(), b.end());//b数组从开始到结尾复制到a的尾部
长风破浪会有时,直挂云帆济沧海!
可通过下方链接找到博主
https://www.cnblogs.com/judes/p/10875138.html