文章目录
- 问题处理记录
-
- 概念
-
- vector声明和初始化
- vector的基本操作
- 二维向量
- vector的begin() end() 和 front() back()的区别
- 示例
- 应用场景
- C++中Vector.erase()删除某一元素的正确用法
问题处理记录
std::vector查找指定元素C++
https://blog.csdn.net/qq_43799400/article/details/122699509
https://blog.csdn.net/weixin_37120663/article/details/120696085
if (std::find(vector.begin(), vector.end(), item) != vector.end())
{
//查到指定元素时的操作
}
else
{
//未查到指定元素时的操作
}
概念
vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
vector每次扩容为原来的两倍,对小对象来说执行效率高,但如果遇到大对象,执行效率就低了。
优点
- 不指定一块内存大小的数组的连续存储,即可以像数组一样操作,但可以对此数组进行动态操作。通常体现在push_back() pop_back()
- 随机访问方便,即支持[ ]操作符和vector.at()
- 节省空间。
缺点
- 在内部进行插入删除操作效率低。
- 只能在vector的最后进行push和pop,不能在vector的头进行push和pop。
- 当动态添加的数据超过vector默认分配的大小时要进行整体的重新分配、拷贝与释放。
使用
为了可以使用vector,必须在你的头文件中包含下面的代码:
#include <vector>
vector属于std命名域的,因此需要通过命名限定,如下完成你的代码:
using std::vector;
vector<int> vInts;
std::vector<int> vInts;
注意:
对最后元素操作最快(在后面添加删除最快 ), 此时一般不需要移动内存,只有保留内存不够时才需要
对中间和开始处进行添加删除元素操作需要移动内存,如果你的元素是结构或是类,那么移动的同时还会进行构造和析构操作,所以性能不高 (最好将结构或类的指针放入vector中,而不是结构或类本身,这样可以避免移动时的构造与析构)。
vector声明和初始化
vector 型变量的声明以及初始化的形式也有许多, 常用的有以下几种形式:
std::vector<ElemType> c;
std::vector<ElemType> c1(c2);
std::vector<ElemType> c(n) ;
std::vector<ElemType> c(n,elem);
std::vector<int> a ;
std::vector<int> a(10) ;
std::vector<int> a(10, 1) ;
std::vector<int> b(a) ;
std::vector<int> b(a.begin(), a.begin()+3) ;
ElemType可以为基本的内置类型char,int,double,也可以为结构体/C++对象/string等。
除此之外, 还可以直接使用数组来初始化向量:
int n[] = {1, 2, 3, 4, 5};
std::vector<int> a(n, n+5) ;
std::vector<int> a(&n[1], &n[4]) ;
vector的基本操作
元素访问
std::vector<int> c;
c.at(index);
operator[index]
c.front();
c.back();
c.date();
迭代器
std::vector<int> c;
c.begin();
c.end();
c.rbegin();
c.rend();
其他还有:cbegin,cend,crbegin,crend;
std::vector<int>::iterator it;
for (it = vec.begin(); it != vec.end(); it++)
cout << *it << endl;
for (size_t i = 0; i < vec.size(); i++) {
cout << vec.at(i) << endl;
}
容量
c.empty();
c.size();
c.max_size();
c.reserve(num);
c.capacity();
c.shrink_to_fit()
修改器
c.clear();
c.push_back(elem);
c.pop_back();
c.insert();
c.erase();
c.resize(num,defult);
c1.swap(c2);
示例:
c.insert(p,elem);
c.insert(p,n,elem);
c.insert(p,begin,end);
c.erase(begin,end) 删除begin,end区间的数据,返回指向下一个数据位置的指针(迭代器)
二维向量
与数组相同, 向量也可以增加维数, 例如声明一个m*n大小的二维向量方式可以像如下形式:
vector< vector<int> > b(10, vector<int>(5));
vector的begin() end() 和 front() back()的区别
https://blog.csdn.net/duan19920101/article/details/51679517/
https://www.cnblogs.com/xiaoyoucai/p/8283548.html
示例
示例一:
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
int main()
{
std::vector<int> v_queue;
int a = 5, b = 8, result = 0;
v_queue.push_back( a );
v_queue.push_back( b );
for (std::vector<int>::iterator it = v_queue.begin(); it != v_queue.end(); ++it)
{
cout << *it << endl;
}
if(!v_queue.empty())
{
result = v_queue.front();
cout << "result:" << result << endl;
v_queue.erase(v_queue.begin());
}
for (std::vector<int>::reverse_iterator it = v_queue.rbegin(); it != v_queue.rend(); ++it)
{
cout << *it << endl;
}
for(int i = 0; i < v_queue.size(); i++ )
{
cout << v_queue[ i ];
}
return 0;
}
注意事项:
- 多线程操作时,需要添加线程锁对数据进行保护;
- 但凡使用了迭代器的循环体,都不要向迭代器所属的容器添加元素;
应用场景
参考资料:
https://www.cnblogs.com/zhonghuasong/p/5975979.html
https://www.cnblogs.com/skyfsm/p/6934246.html
C++中Vector.erase()删除某一元素的正确用法
https://blog.csdn.net/Sway_2012/article/details/7768040
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)