STL序列容器之vector
一,vector容器简介
1.vector容器的原理
vector是将元素置于一个动态数组中加以管理的容器。
2.vector容器的特点
vector容器可以随机存取元素,支持索引存取(即用数组下标的方式存取)。vector容器在尾部插入和删除数据比较快,但是在中部或者头部插入或者删除元素比较费时。
3.vector容器的使用
vector容器对应得头文件:# include<vector>
二,vector容器的构造函数
1.vector的无参构造函数
// 定义一个存放int类型的向量容器
vector<int> v1;
// 定义存放一个double类型的向量容器
vector<double> v2;
// 定义一个存放string类型的向量容器
vector<string> v3;
// 定义一个存放自定义类型的向量容器,该类型必须提供拷贝构造函数,因为容器的存放是按值复制的方式
vector<Student> v4;
2.vector的有参构造函数
// 使用数组初始化vector
int array[] = { ,,,,,,,, };
vector<int> v1(array, array + );
// 使用vector初始化vector
vector<int> v2(v1.begin(), v1.begin() + );
// 使用n个相同的元素初始化vector
vector<char> v3(, 'A');
3.vector的拷贝构造函数
// 使用n个相同的元素初始化vector
vector<char> v1(, 'A');
// 拷贝构造函数
vector<char> v2 = v1;
4.vector的析构函数
vector的析构函数和用来释放容器中元素所占用的内存。
三,操作符重载函数
1.赋值操作符
// 定义向量v1
vector<char> v1(, 'A');
// 定义向量v2
vector<char> v2;
// 赋值操作符重载
v2 = v1;
2.数组下标操作符
// 创建vector容器
vector<char> v;
// 添加元素到vector中
v.push_back('A');
v.push_back('B');
v.push_back('C');
v.push_back('D');
// 获取第二个元素
char c2 = v[];
// 修改第二个元素
v[] = 'X';
四,成员函数
1.vector的尾部添加和尾部删除操作
// vector的尾部添加元素
vector<char> v1;
v1.push_back('A');
v1.push_back('B');
v1.push_back('C');
v1.push_back('D');
// vector的尾部删除元素
v1.pop_back();
v1.pop_back();
2.vector获取头部和尾部元素
// 创建vector容器
vector<char> v1;
// 往vector插入元素
v1.push_back('A');
v1.push_back('B');
v1.push_back('C');
v1.push_back('D');
// 获取vector的头元素和尾部元素
char first = v1.front();
char last = v1.back();
3.vector的长度
// 定义vector容器
vector<int> v1(,);
// 获取vector的长度
int v1_size = v1.size();
4.vector是否为空及清空元素操作
// 创建vector容器
vector<int> v1(,);
// 判断vector容器是否为空
bool isEmpty = v2.empty();
// vector容器的元素清空
v2.clear();
5.vector元素的获取和修改
// 创建vector容器
vector<char> v;
// 添加元素到vector中
v.push_back('A');
v.push_back('B');
v.push_back('C');
v.push_back('D');
// 获取第二个元素
char c2 = v[];
// 获取第三个元素
char c3 = v.at();
// 修改第二个元素
v[] = 'X';
6.vector的遍历
// 创建vector容器
vector<int> v1(,);
// 增强for遍历
for (int tmp : v1)
{
cout << tmp << " ";
}
cout << endl;
// 迭代器正向遍历
for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
{
*it += ;
cout << *it << " ";
}
cout << endl;
// 迭代器逆向遍历
for (vector<int>::reverse_iterator it = v1.rbegin(); it != v1.rend(); it++)
{
cout << *it << " ";
}
cout << endl;
7.vector的插入
// 创建vector容器
vector<char> v(, 'A');
// 在vector容器的第二个位置插入字符'X'
v.insert(v.begin() + , 'X');
// 在vector容器的最后位置插入5个'B'
v.insert(v.end(), , 'B');
8.vector的删除
// 创建vector容器
vector<char> v;
// 存入数据
v.push_back('A');
v.push_back('B');
v.push_back('C');
v.push_back('D');
v.push_back('E');
// 删除第2个元素
v.erase(v.begin() + );
// 删除最后两个元素
v.erase(v.end() - , v.end());
9.vector的遍历删除
# include<iostream>
# include<vector>
# include<deque> using namespace std; int main()
{
// 定义容器
vector<int> v;
// 添加数据
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
// 这里注意不需要++it
for (vector<int>::iterator it = v.begin(); it != v.end();)
{
// 删除偶数
if (*it % == )
{
// erase删除该元素后返回下一个元素的迭代器
it = v.erase(it);
}
else {
it++;
}
}
// 遍历
for (int tmp : v)
{
cout << tmp << " ";
}
cout << endl; return ;
}
五,vector容器添加自定义数据类型
1.定义老师类
#pragma once
# include<iostream>
using namespace std;
/* 定义老师类 */
class Teacher
{
private:
char * name;
int age;
public:
Teacher();
Teacher(char * name, int age);
/* 如果往容器中存入数据,必须定义拷贝构造函数 */
Teacher(const Teacher& teacher);
~Teacher();
public:
friend ostream& operator<<(ostream& out, Teacher& teacher);
};
2.老师类的实现
# define _CRT_SECURE_NO_WARNINGS
# include<iostream>
# include"Teacher.h"
using namespace std;
/* 无参构造 */
Teacher::Teacher()
{
this->name = NULL;
this->age = ;
}
/* 有参构造 */
Teacher::Teacher(char * name, int age)
{
this->name = new char[strlen(name)+];
strcpy(this->name, name);
this->age = age;
}
/* 拷贝构造函数 */
Teacher::Teacher(const Teacher& teacher)
{
this->name = new char[strlen(teacher.name)+];
strcpy(this->name, teacher.name);
this->age = teacher.age;
}
/* 析构函数 */
Teacher::~Teacher()
{
if (this->name != NULL)
{
delete [] this->name;
this->name = NULL;
this->age = ;
}
}
/* 友元函数:重载左移操作符 */
ostream& operator<<(ostream& out, Teacher& teacher)
{
cout << teacher.name << " = " << teacher.age;
return out;
}
3.向量容器存入老师对象
# include<iostream>
# include<vector>
# include"Teacher.h"
using namespace std; int main()
{
// 定义容器
vector<Teacher> v;
// 定义5个老师对象
Teacher t1("刘备", );
Teacher t2("关羽", );
Teacher t3("张飞", );
Teacher t4("赵云", );
Teacher t5("马超", );
// 存入向量容器
v.push_back(t1);
v.push_back(t2);
v.push_back(t3);
v.push_back(t4);
v.push_back(t5);
// 遍历
for (Teacher t : v)
{
cout << t << endl;
} return ;
}
STL序列容器之vector的更多相关文章
- C++STL模板库序列容器之vector
目录 STL之Vecter 一丶STL简介 二丶Vector用法 1.vector容器的使用 2.vector迭代器. 3.vector中的方法. 三丶常用算法 1.常见算法中的算法方法. 2.sor ...
- C++序列容器之 vector常见用法总结
一.关于vector 本文默认读者具有一定的c++基础,故大致叙述,但保证代码正确. vector是一个动态的序列容器,相当于一个size可变的数组. 相比于数组,vector会消耗更多的内存以有效的 ...
- STL序列容器之deque
一,deque的基础知识 1.deque的基础 deque是“double-ended-queue”的缩写,意思是双端队列,其和vector的区别在于vector是单端的. deque在头部和尾部插入 ...
- [知识点]C++中STL容器之vector
零.STL目录 1.容器之map 2.容器之vector 3.容器之set 一.前言 关于STL和STL容器的概念参见STL系列第一篇——map(见上).今天介绍第二个成员——vector. 二.用途 ...
- C++ 序列式容器之vector
什么是容器 容器,顾名思义,是用来容放东西的场所.C++容器容放某种数据结构,以利于对数据的搜寻或排序或其他特殊目的.众所周知,常用的数据结构不外乎:数组array, 链表list, 树tree ...
- STL容器之vector
[1]模板类vector 模板类vector可理解为广义数组.广义数组,即与类型无关的数组,具有与数组相同的所有操作. 那么,你或许要问:既然C++语言本身已提供了一个序列式容器array,为什么还要 ...
- C++STL模板库序列容器之List容器
目录 一丶List容器的存储结构 二丶丶STL中list容器的使用. 一丶List容器的存储结构 list容器底层是链表结构来维护的.跟vector不一样. vector是数组维护的.拥有连续内存.所 ...
- C++STL模板库序列容器之deque
目录 一丶队列容器deque简介 二丶使用代码演示 一丶队列容器deque简介 deque底层跟vector一样,都是数组维护.不同的是可以操作头部. 二丶使用代码演示 #define _CRT_SE ...
- C++ STL 常用容器之 stack
C++ STL Container--Stack 栈是一种先进后出(LIFO)的数据结构,限制只能在一端完成插入和删除操作,这一端叫做栈顶(top),另一端即为栈底(bottom).C++ STL(S ...
随机推荐
- Dynamics CRM 2015/2016 Web API:Unbound Function 和 Bound Function
今天我们来看看Dynamics CRM Web API Function 吧, 这是一个新概念,刚接触的时候我也是比較的迷糊.这种命名确实是和之前的那套基于SOAP协议的API全然联系不上.好了,不说 ...
- client产生CLOSE_WAIT状态的解决方式
现象 生产环境和測试环境都发现有个外围应用通过搜索服务调用搜索引擎时.偶尔会出现大量的訪问超时的问题,通过例如以下方式进行分析排查: l 首先是拿到搜索服务的JavaCore.发现其堵在HttpCli ...
- C#无符号右移
/// <summary> /// 无符号右移,与JS中的>>>等价 /// </summary> /// & ...
- 【Codeforces Round #185 (Div. 2) A】 Whose sentence is it?
[链接] 链接 [题意] 告诉你每句话; 然后每句话是谁说的和开头与结尾的一段字符串有关. [题解] 一个一个判断就好; 注意大小<5的情况 [错的次数] 在这里输入错的次数 [反思] 在这里输 ...
- 机器学习01-kNN邻近算法
k-近邻算法 概述:k-近邻算法採用測量不同特征值之间的距离方法进行分类 长处:精度高.对于异常值不敏感.无数据输入假定 缺点:计算复杂度高,空间复杂度高,而且它没有办法各处基础数据的一些内部信息数据 ...
- Havel-Hakimi定理 hdu2454 / poj1695 Havel-Hakimi定理
Havel-Hakimi定理 当年一度热门出如今ACM赛场上的算法. 算法定义: Havel-Hakimi定理主要用来判定一个给定的序列是否是可图的. 2.首先介绍一下度序列:若把图 G 全部顶点的度 ...
- Hadoop基本原理之一:MapReduce 分类: A1_HADOOP 2014-08-17 19:26 1113人阅读 评论(0) 收藏
1.为什么需要Hadoop 目前,一块硬盘容量约为1TB,读取速度约为100M/S,因此完成一块硬盘的读取需时约2.5小时(写入时间更长).若把数据放在同一硬盘上,且全部数据均需要同一个程序进行处理, ...
- Intent七在属性之一:ComponentName 分类: H1_ANDROID 2013-11-10 10:54 1184人阅读 评论(1) 收藏
注:在<疯狂android讲义>中,此属性称为Component,官方文档中称为ComponentName. 1.The name of the component that should ...
- TreeMap、HashMap、ConcurrentSkipListMap之性能比较
比较Java原生的 3种Map的效率. 1. TreeMap 2. HashMap 3. ConcurrentSkipListMap 结果: 模拟150W以内海量数据的插入和查找,通过增加和查找 ...
- Android多线程研究(1)——线程基础及源码剖析
从今天起我们来看一下Android中的多线程的知识,Android入门容易,但是要完成一个完善的产品却不容易,让我们从线程开始一步步深入Android内部. 一.线程基础回顾 package com. ...