当前位置: 首页 > article >正文

vector 的使用(上)

1.概念

vector本质是顺序表。它像数组一样,用一块连续的空间对数据进行管理,但又区别于数组,它的空间是根据数据进行动态增容的,并封装了一系列成员变量对数据进行监控,封装成员函数对数据进行操作。

2.区别

vector<char>和string(basic_string<char>)有什么区别呢?

1.string处理的是单向信息,而vector<char>处理的是多向信息。例如存放一个人的身份证号,我们更倾向于用string。

2.string的_str末尾有\0,而vector<char>因为存放的是单个单个的字符,因此没有\0的存储.

3.string因为其处理是单向的信息,因此operator+=有其意义,而vector<char>并没有。

3.vector的构造函数

3.1.默认构造函数(无参数) 

vector<int> a;

3.2.填充构造函数(vector(size_t n ,const value_type& val  = value_type()))

vector<int> a2(18, 9);//创建18个9

 3.3.拷贝构造函数

vector<int> a;  // 无参数构造
a.push_back(1);
a.push_back(2);
a.push_back(3);
a.push_back(4);
vector<int> a1(a); //拷贝构造

3.4.基于迭代器的范围构造(迭代器范围构造都是左闭右开) 

//范围构造;用迭代器构造都是左闭右开!
vector<int> a3(a1.begin(), a1.begin() + 2);//只有 1 2 

4.vector的遍历即元素访问

4.1利用operator[]和size

for (int i = 0; i < a.size(); i++)
{
	cout << a[i] << " ";
}
cout << endl;

4.2利用迭代器

vector<int>::iterator it = a1.begin();
while (it != a1.end())
{
	cout << *it << " ";
	++it;
}
cout << endl;

4.3.利用基于迭代器的范围for

	for (auto& x : a2)
	{
		cout << x << " ";
	}
	cout << endl;

4.4 at函数进行元素访问

vector<int> a(4, 4);
cout << a.at(0);

at函数进行元素访问与operator[]进行访问的区别是at访问失败会抛出异常,而operator[]会直接崩溃. 可以用front和back获取首元素和尾元素.

5.迭代器

与string类似。正向用begin()和end()获取,反向用rbegin()和rend()获取;

6. vector的空间增长问题

上述函数的使用都和string类的相同,值得重新注意的是:resize是改变空间的size,如果变大了会初始化空间,而reserve只是单纯的增长空间容量,并不会初始化空间。

在vs,pj版本的stl下当capacity需要扩容时是按照1.5倍扩容

而在linux的g++下,sgi版本的stl下,当capacity需要扩容的时候是按照2倍扩容。

面试中常常会问按照1.5倍好,还是2倍好?其实选择1.5或者2倍是一种选择,需要考虑到效率和空间利用率两方面的问题:按照2倍扩容,扩容次数少了,效率高了,但是空间利用率可能会低。如果按照1.5倍扩容,扩容次数多了,效率低了,但是可能空间利用率就高了。因此需要看数据量的多少酌情考虑.

7.vector的增删查改

7.1 push_back和pop_back

7.2 find(并不是vector中的,在库函数std的algorithm中)

值得注意的是,因为其有普遍性,因此给他传入的是一个迭代器范围,和要找的变量。如果找到就返回该位置的迭代器,找不到就返回end位置迭代器。(注意:只能找到第一个)

 

 例:删除vector中的指定数据

vector<int> a;
a.push_back(0);
a.push_back(7);
a.push_back(5);
a.push_back(6);
a.push_back(6);
a.push_back(5);
//如果存在我要删除a中的所有5;
auto begin = a.begin();
while (begin != a.end())
{
	auto it = find(begin, a.end(), 5);
	if (it != a.end())
	{
		begin = a.erase(it);
	}

}
for (auto& x : a)
{
	cout << x << " ";
}

 7.3erase和insert(都是用迭代器实现)

erase

分别是删除指定迭代器位置的数据,并返回新的下个位置。和范围删除。

                                                                        insert

 在指定的迭代器位置前,插入数据。或者插入n个相同的数据,或者插入一个数据段。 

7.4swap

交换两个vector的数据空间,实际上是利用库的swap,分别交换_str,_size,_capacity,然后在类里面保证成函数


http://www.kler.cn/news/331940.html

相关文章:

  • SAP_FI_科目组,科目表,科目之间的关系
  • 算法日记-链表翻转
  • 【优选算法】(第十九篇)
  • 算法训练营打卡Day19
  • 在Robot Framework中Run Keyword If的用法
  • stm32f103调试,程序与定时器同步设置
  • 基于Spring Boot+Unipp的中考体测训练小程序(协同过滤算法、图形化分析)【原创】
  • 前缀和算法详解
  • Acwing 背包问题
  • UE5.4.3 录屏回放系统ReplaySystem蓝图版
  • 无水印短视频素材下载网站有哪些?十个高清无水印视频素材网站分享
  • Angular ng-state script 元素的生成机制介绍
  • PHP中对数组序列化和反序列化的函数
  • 10.3 刷题
  • 前端——切换轮播图
  • 如何利用ChatGPT开发一个盈利的AI写作助手网站
  • 图片尺寸缩放批量剪辑:高效方法与技巧分享
  • NIM简单实践-图像分割
  • Ubuntu 系统崩了,如何把数据拷下来
  • Visual Studio 字体与主题推荐