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的尾部

 

posted @ 2022-01-13 09:54  朱小勇  阅读(470)  评论(0编辑  收藏  举报