STL之Vecter

一丶STL简介

STL 是标准模板库的意思. 就是数据结构,封装成类让我们使用. 使用的时候我们要了解数据结构才可以使用这些类.因为数据结构不知道是什么结构你用类的话也用不明白.

二丶Vector用法

1.vector容器的使用

首先介绍的第一个序列容器就是 vector. 它底层是数组.可以理解为是动态数组.

我们自己也可以写一个动态数组.然后 将运算符[] 进行重载.

使用之前需要包含头文件,以及使用命名空间.std. 类是在这里面定义的.

 #include<vector>
using namespace std;

因为是动态数组.所以vector容器操作的都是尾部操作.就也是数组后面进行增删改查.

2.vector迭代器.

vector的迭代器有两种.

vector<object>::const_iterator  const_iterator迭代器是不能修改内容的
vector<object>::iterator iterator定义的迭代器是可读可写的.

编写代码如下:

栈代码:

#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int main(char *argc,char *argv[])
{ vector<int> a;
a.push_back(1);
a.push_back(2); vector<int>::const_iterator it = a.begin();
while (it != a.end())
{
cout << *it << endl;
++it;
}
system("pause"); }

方法:

push_back(Value); 是往数组后面添加值.

begin(); 获取第一个元素

end(); 获取最后一个元素.

*it 获取值.

上面的代码使我们存放的int类型数据. 其实vector可以当做数组来用.是变长的数组.

跨平台的. 我们不光可以存储int 也可以存储 基本类型.以及指针类型都是可以的.或者存储

函数指针也可以.

例如下:

typedef int(*pFn)(int , int );
int Add(int a, int b)
{
return a + b;
}
int main(char *argc,char *argv[])
{
pFn p = Add;
vector<pFn> pfnve;
pfnve.push_back(p);
vector<pFn>::iterator it = pfnve.begin();
while (it != pfnve.end())
{
cout << (*it)(1, 2) << endl; //第一种输出方式
cout << it[0](1, 4) << endl; //使用[]操作符输出
it++;
}
system("pause"); }

结果第一个会输出3,第二个会输出五,因为我们存储了一个函数指针.如果存储多个.则可以进行多次调用.

堆代码:

上面使用的 vector是在栈中定义的,我们也可以定义为指针.也就是在堆中使用.

代码如下:

int main(char *argc,char *argv[])
{
vector<int> *a = new vector<int>;
a->push_back(1);
a->push_back(2);
a->push_back(4);
a->push_back(3);
a->push_back(5); vector<int>::const_iterator it = a->cbegin();
while (it != a->cend())
{
cout << (*it) << endl;
cout << it[0] << endl;
it++;
}
cout << "---------------------------" << endl; system("pause"); }

cbegin(); 也是返回第一个元素,前提是你使用const_iterator 迭代器才可以. cbegin()c开头就是const的意思.常量的意思.也就是说不能更改.

3.vector中的方法.

push_back(Value); 往vector容器后面添加一个数据.

begin(); 获取第一个元素.

end(); 标记容器的最后一个元素.只代表结束标记.

int size(); 容器中元素的个数,可以通过 for(i < xx.size());的方式遍历

void clear(); 清空容器中的所有元素

Object front(); 返回容器中第一个元素的值,跟begin()不同,它是返回值

Object back(); 返回容器中最后一个元素的值

void pop_back(); 清空最后一个元素,需要配合back();否则除非你不需要最后一个元素.

erase(); 删除容器中任意一个位置的元素.

三丶常用算法

算法是单独在一个头文件中,我们可以使用算法配合vector容器进行写程序

包含头文件

#include <algorithm>

1.常见算法中的算法方法.

sort(); 排序

reverse(); 反转

find(); 查找

copy(); 拷贝

2.sort()方法的使用

int main(char *argc,char *argv[])
{
vector<int> *a = new vector<int>; srand((unsigned long)time(0)); //随机化种子
for (int i = 0; i < 10; i++)
{
a->push_back(rand() % 100); //从0 - 99 中随机取出一个数字放到容器中
}
//进行排序
sort(a->begin(), a->end()); //输出结果
vector<int>::const_iterator it = a->cbegin();
while (it != a->cend())
{
cout << " " << (*it) ;
it++;
} cout << endl << "---------------------------" << endl; system("pause"); }

使用time srand() rand() 函数的时候,需要包含头文件time.h.

输出结果:



上面使用的sort()排序是默认从小到大的.那么我们想要从大到小怎么办.

此时STL中算法sort()方法规定了.你定义一个compare函数.当做第三个参数传入进来即可.

compare是你自己编写的比较方式.

代码如下:


bool compare(int a, int b)
{
if (a < b)
return true;
return false;
}
返回值必须是bool 函数名无所谓.参数也无所谓.你如果是int类型的容器.就是用int判断.其它类型就是用其它类型判断. 原代码不动,只需要改动sort();方法即可.
sort(a->begin(), a->end(), compare);

程序运行结果:

3.find()方法使用

find()方法是一个查找返回,返回查找到的标记的位置. 也就是说是一个迭代器接受查找到的位置.

代码如下:

find(迭代器开始标记,迭代器结束标记,你要查找的值);

找到了返回 位置. 没有找到.返回结束标记;

 vector<int>::iterator it = find(a->begin(), a->end(),11);

   if (it != a->cend())
{
cout << " find Value " << (*it);
}
else
{
cout << "Not Find" << endl;
}

只贴出核心代码.主要介绍Find函数.

4.删除容器中的元素

这里主要使用find函数配合进行删除,查找到在删除

核心代码

vector<int>::iterator it = find(a->begin(), a->end(),11);

   if (it != a->cend())
{
a->erase(it);
}
else
{
cout << "Not Find" << endl;
}

erase();函数,可以删除容器中的指定的元素.但是删除之后.元素内容会自动进行+1.也就是指向了下一个位置. 此时我们需要--

例如如下代码:

 vector<int>::iterator it = a->begin();
while (it != a->end())
{
cout << *it << endl;
if (*it == 7)
{
a->erase(it); //这里可以删除,但是内部it会指向下一个元素.所以我们需要进行it--才可以使程序正确
it--; //注意这个地方.
cout << "删除成功" << endl;
}
it++;
}

三丶vector操作类或者结构体

代码如下:

typedef struct _PersonInfo
{
char szName[20];
int age;
float height;
}PersonInfo ,*PPersonInfo; int main(char *argc, char *argv[]) { //定义两种类型迭代器.保存结构体,以及结构体指针的迭代器
vector<PersonInfo> one;//保存结构体
vector<PPersonInfo> two;//保存结构体指针
PersonInfo p1 = { "tom", 14, 1.76f };
PPersonInfo p2 = new PersonInfo; //指针的话必须申请内存
strncpy(p2->szName, "李四", 20); //指针的话使用函数拷贝
p2->age = 15;
p2->height = 1.59f; //使用容器进行存储
one.push_back(p1);
two.push_back(p2); //存储指针 //进行迭代
vector<PersonInfo>::iterator it1 = one.begin();
while (it1 != one.end())
{
cout << it1->szName << " " << it1->age << " " << it1->height << endl; //输出的时候使用->指向箭头输出. 或者 it[i].name方式
it1++;
}
//对指针进行迭代.
cout << "-----------------------------" << endl;
vector<PPersonInfo>::iterator it2 = two.begin();
while (it2 != two.end())
{
cout << (*it2)->szName << " " << (*it2)->age << " " << (*it2)->height
<< endl;
it2++;
}
system("pause");
}

总结一下: 操作结构体跟操作类是一样的. 迭代的时候.我们可以用->运算符直接取值. 如果是存储指针.

那么我们就要 (*it)->member 方式去操作了.

C++STL模板库序列容器之vector的更多相关文章

  1. C++STL模板库序列容器之List容器

    目录 一丶List容器的存储结构 二丶丶STL中list容器的使用. 一丶List容器的存储结构 list容器底层是链表结构来维护的.跟vector不一样. vector是数组维护的.拥有连续内存.所 ...

  2. C++STL模板库序列容器之deque

    目录 一丶队列容器deque简介 二丶使用代码演示 一丶队列容器deque简介 deque底层跟vector一样,都是数组维护.不同的是可以操作头部. 二丶使用代码演示 #define _CRT_SE ...

  3. C++STL模板库关联容器之set/multiset

    目录 一丶关联容器简介.set/multiset 二丶演示代码. 一丶关联容器简介.set/multiset 我们的序列容器,底层都是线性表构成的. 比如 vector list deque. 关联容 ...

  4. iBinary C++STL模板库关联容器之map/multimap

    目录 一丶关联容器map/multimap 容器 二丶代码例子 1.map的三种插入数据的方法 3.map集合的遍历 4.验证map集合数据是否插入成功 5.map数据的查找 6.Map集合删除元素以 ...

  5. STL序列容器之vector

    一,vector容器简介 1.vector容器的原理 vector是将元素置于一个动态数组中加以管理的容器. 2.vector容器的特点 vector容器可以随机存取元素,支持索引存取(即用数组下标的 ...

  6. C++序列容器之 vector常见用法总结

    一.关于vector 本文默认读者具有一定的c++基础,故大致叙述,但保证代码正确. vector是一个动态的序列容器,相当于一个size可变的数组. 相比于数组,vector会消耗更多的内存以有效的 ...

  7. [知识点]C++中STL容器之vector

    零.STL目录 1.容器之map 2.容器之vector 3.容器之set 一.前言 关于STL和STL容器的概念参见STL系列第一篇——map(见上).今天介绍第二个成员——vector. 二.用途 ...

  8. STL容器之vector

    [1]模板类vector 模板类vector可理解为广义数组.广义数组,即与类型无关的数组,具有与数组相同的所有操作. 那么,你或许要问:既然C++语言本身已提供了一个序列式容器array,为什么还要 ...

  9. C++ 泛型程序设计与STL模板库(1)---泛型程序设计简介及STL简介与结构

    泛型程序设计的基本概念 编写不依赖于具体数据类型的程序 将算法从特定的数据结构中抽象出来,成为通用的 C++的模板为泛型程序设计奠定了关键的基础 术语:概念 用来界定具备一定功能的数据类型.例如: 将 ...

随机推荐

  1. kaggle之泰坦尼克号乘客死亡预测

    目录 前言 相关性分析 数据 数据特点 相关性分析 数据预处理 预测模型 Logistic回归训练模型 模型优化 前言 一般接触kaggle的入门题,已知部分乘客的年龄性别船舱等信息,预测其存活情况, ...

  2. github-新建文件夹

    1,进入仓库“ sstruggle.github.io ”中,在该仓库页面中找到“ Create new file ”,如图: 2,在创建新文件页面,输入“ js/ ”,github默认为是一个文件夹 ...

  3. LOJ 6092

    这个题也很没意思 发现q那么大没有用, 不重复的询问有26*n种 所以记录一下就好了 #include<bits/stdc++.h> using namespace std; #defin ...

  4. PHP如何搭建百度Ueditor富文本编辑器

    本文为大家分享了PHP搭建百度Ueditor富文本编辑器的方法,供大家参考,具体内容如下 下载UEditor 官网:下载地址 将下载好的文件解压到thinkphp项目中,本文是解压到PUBLIC目录下 ...

  5. GDKOI2017滚粗记

    Preface 比赛成绩非常烂,却腐败得非常爽,但是gmh大爷因为和我们腐败,变得更强. 比赛策略有点问题,拼命想正解而没了暴力分 数论题做得比较少,导致只会找规律.知识点需要补充,如AC自动机,启发 ...

  6. ECS云服务器配置数据库远程链接

    环境: windows server 2012 R2 Datacenter(数据中心版本) sql server 2008 R2 Express (环境的安装步骤此处不做教程) 开启远端链接重要步骤如 ...

  7. Web开发者の实用代码账簿

    介里就都是恶魔菌整理的我平时会用的代码啦-现在在这里总结规划一下,希望能对你以及其他阅读这篇文章的小可耐们有帮助喵!欢迎订阅我的博客来get恶魔菌记事簿的新动态鸭! ↓ ↓ ↓ 以下就是内容啦~记得看 ...

  8. ipset和iptables配合来自动封闭和解封有问题的IP

    iptables封掉少量ip处理是没什么问题的,但是当有大量ip攻击的时候性能就跟不上了,iptables是O(N)的性能.而ipset就像一个集合,把需要封闭的ip地址放入这个集合中,ipset 是 ...

  9. 3.ifconfig

    Windows下查看IP地址用ipconfig Linux 下查看IP地址用ifconfig 还有 ip addr      而ipconfig 和ip addr的区别则是与net-tools工具和i ...

  10. 关于Django字段类型中 blank和null的区别

    blank 设置为True时,字段可以为空.设置为False时,字段是必须填写的.字符型字段CharField和TextField是用空字符串来存储空值的. 如果为True,字段允许为空,默认不允许. ...