vector(动态数组)(粘)

一、概述

vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector是一个容器,它能够存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,可以动态改变大小。
例如:

1
2
3
4
// c语言风格
int myHouse[100] ;
// 采用vector
vector<int> vecMyHouse(100);

当如上定义后,vecMyHouse就可以存放100个int型的数据了。

1. 它可以像普通数组一样访问
例如:

1
vecMyHouse[50] = 1024;

2. 你可以顺序地向容器中填充数据
例如:

1
2
3
4
5
int i =0 ;
for( ;i< 25; i++ )
{
vecMyHouse.push_back(1);
}

3. 它还可以动态地改变它的大小,通过下面这条语句实现
将容器的大小改为400,这样容器中就可以容纳400个int型数据了
例如:

1
vecMyHouse.resize(400);

4. 你也可以在容器中装入自定义的数据类型
例如:

1
2
3
4
5
6
// 自定义一个class
class Cmyclass
{
};
// 定义一个存放class的容器
vector<Cmyclass> vecMyHouse;

5. 你可以在定义容器时为它赋初值

1
2
// 定义一个容纳100个int型数据的容器,初值赋为0
vector<int> vecMyHouse(100,0);

6. 你可以把一个容器的对象赋值给另外一个容器
例如:

1
2
3
4
5
// 定义一个容纳100个int型数据的容器,初值赋为0
vector<int> vecMyHouse(100,0);
// 定义一个新的容器,内容与上述容器一样
vector<int> myVec ;
myVec = vecMyHouse;

二、 以上是vector容器的简单介绍,下面将详细介绍它的其他功能:

1. 为了使用vector,必须在你的头文件中包含下面的代码:

1
#include <vector>

2. vector属于std命名域的,因此需要通过命名限定,可以在文件开头加上

1
using std::vector;

或者

1
using namespace std;

或者直接在使用vector的代码前加前缀
例如:

1
std::vector<int> myHouse;

3. vector提供如下函数或操作:
下面列举了部分常用的功能

1
2
// 定义一个vector
std::vector<int> c;

可以使用的功能:
c.clear()         移除容器中所有数据。
c.empty()         判断容器是否为空。
c.erase(pos)        删除pos位置的数据
c.erase(beg,end) 删除[beg,end)区间的数据
c.front()         传回第一个数据。
c.insert(pos,elem)  在pos位置插入一个elem拷贝
c.pop_back()     删除最后一个数据。
c.push_back(elem) 在尾部加入一个数据。
c.resize(num)     重新设置该容器的大小
c.size()         回容器中实际数据的个数。
c.begin()           返回指向容器第一个元素的迭代器
c.end()             返回指向容器最后一个元素的迭代器

三、下面描述一下什么是迭代器

迭代器相当于指针,例如:

1
2
3
4
5
// 对于变量而言,使用指针指向对应的变量
// 以后就可以使用 * 加指针来操作该变量了
int a = 10;
int *p;
p = &a;

使用指针操作该变量
例如: *p = 11; // 操作后a变为 11
对于容器,使用迭代器操作容器中对应位置的值
当迭代器指向了容器中的某位置,则可以使用 * 加迭代器操作该位置了

1
2
3
4
5
6
7
// 定义一个vector
std::vector<int> myVec;
//添加10个元素
for(int j =0 ; j<10 ; j++)
{
myVec.push_back(j);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 定义一个迭代器
std::vector<int>::iterator p;
// 指向容器的首个元素
p = myVec.begin();
// 移动到下一个元素
p ++;
// 修改该元素赋值
*p = 20 ; //< 则myVec容器中的第二个值被修改为了20
// 循环扫描迭代器,改变所有的值
p = myVec.begin();
for( ; p!= myVec.end(); p++ )
{
*p = 50;
}

以上简单讲述了vector的用法,仅供入门之用,下面以实例形式继续加以说明。

1.vector 的数据的存入和输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>
#include<vector>
#include <iostream>
using namespace std;
void main()
{
 int i = 0;
  vector<int> v;
  for( i = 0; i < 10; i++ )
 {
      v.push_back( i );//把元素一个一个存入到vector中
 }
  //对存入的数据清空
 for( i = 0; i < v.size(); i++ )//v.size() 表示vector存入元素的个数
 {
     cout << v[ i ] << " "; //把每个元素显示出来
 }
 cont << endl;
}

注:你也可以用v.begin()和v.end() 来得到vector开始的和结束的元素地址的指针位置。

你也可以这样做:

1
2
3
4
5
vector<int>::iterator iter;
for( iter = v.begin(); iter != v.end(); iter++ )
{
  cout << *iter << endl;
}

2. 对于二维vector的定义。
1)定义一个10个vector元素,并对每个vector符值1-10。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<stdio.h>
#include<vector>
#include <iostream>
using namespace std;
void main()
{
int i = 0, j = 0;
//定义一个二维的动态数组,有10行,每一行是一个用一个vector存储这一行的数据。
//所以每一行的长度是可以变化的。之所以用到vector<int>(0)是对vector初始化,否则不能对vector存入元素。
vector< vector<int> > Array( 10, vector<int>(0) );
for( j = 0; j < 10; j++ )
{
 for ( i = 0; i < 9; i++ )
 {
  Array[ j ].push_back( i );
 }
}
for( j = 0; j < 10; j++ )
{
 for( i = 0; i < Array[ j ].size(); i++ )
 {
  cout << Array[ j ][ i ] << " ";
 }
 cout<< endl;
}
}

2)定义一个行列都是变化的数组。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<stdio.h>
#include<vector>
#include <iostream>
using namespace std;
void main()
{
int i = 0, j = 0;
vector< vector<int> > Array;
vector< int > line;
for( j = 0; j < 10; j++ )
{
 Array.push_back( line );//要对每一个vector初始化,否则不能存入元素。
 for ( i = 0; i < 9; i++ )
 {
  Array[ j ].push_back( i );
 }
}
for( j = 0; j < 10; j++ )
{
 for( i = 0; i < Array[ j ].size(); i++ )
 {
  cout << Array[ j ][ i ] << " ";
 }
 cout<< endl;
}
}

使用 vettor erase 指定元素,示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include "iostream"
#include "vector"
using namespace std;
int main()
{
  vector<int> arr;
  arr.push_back(6);
  arr.push_back(8);
  arr.push_back(3);
  arr.push_back(8);
  for(vector<int>::iterator it=arr.begin(); it!=arr.end(); )
  {
    if(* it == 8)
    {
      it = arr.erase(it);
    }
    else
    {
      ++it;
    }
  }
  cout << "After remove 8:\n";
  for(vector<int>::iterator it = arr.begin(); it < arr.end(); ++it)
  {
    cout << * it << " ";
  }
  cout << endl;
}

本文实例展示了C++中的vector用法,分享给大家供大家参考。具体如下:

一、概述

vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector是一个容器,它能够存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,可以动态改变大小。
例如:

1
2
3
4
// c语言风格
int myHouse[100] ;
// 采用vector
vector<int> vecMyHouse(100);

当如上定义后,vecMyHouse就可以存放100个int型的数据了。

1. 它可以像普通数组一样访问
例如:

1
vecMyHouse[50] = 1024;

2. 你可以顺序地向容器中填充数据
例如:

1
2
3
4
5
int i =0 ;
for( ;i< 25; i++ )
{
vecMyHouse.push_back(1);
}

3. 它还可以动态地改变它的大小,通过下面这条语句实现
将容器的大小改为400,这样容器中就可以容纳400个int型数据了
例如:

1
vecMyHouse.resize(400);

4. 你也可以在容器中装入自定义的数据类型
例如:

1
2
3
4
5
6
// 自定义一个class
class Cmyclass
{
};
// 定义一个存放class的容器
vector<Cmyclass> vecMyHouse;

5. 你可以在定义容器时为它赋初值

1
2
// 定义一个容纳100个int型数据的容器,初值赋为0
vector<int> vecMyHouse(100,0);

6. 你可以把一个容器的对象赋值给另外一个容器
例如:

1
2
3
4
5
// 定义一个容纳100个int型数据的容器,初值赋为0
vector<int> vecMyHouse(100,0);
// 定义一个新的容器,内容与上述容器一样
vector<int> myVec ;
myVec = vecMyHouse;

二、 以上是vector容器的简单介绍,下面将详细介绍它的其他功能:

1. 为了使用vector,必须在你的头文件中包含下面的代码:

1
#include <vector>

2. vector属于std命名域的,因此需要通过命名限定,可以在文件开头加上

1
using std::vector;

或者

1
using namespace std;

或者直接在使用vector的代码前加前缀
例如:

1
std::vector<int> myHouse;

3. vector提供如下函数或操作:
下面列举了部分常用的功能

1
2
// 定义一个vector
std::vector<int> c;

可以使用的功能:
c.clear()         移除容器中所有数据。
c.empty()         判断容器是否为空。
c.erase(pos)        删除pos位置的数据
c.erase(beg,end) 删除[beg,end)区间的数据
c.front()         传回第一个数据。
c.insert(pos,elem)  在pos位置插入一个elem拷贝
c.pop_back()     删除最后一个数据。
c.push_back(elem) 在尾部加入一个数据。
c.resize(num)     重新设置该容器的大小
c.size()         回容器中实际数据的个数。
c.begin()           返回指向容器第一个元素的迭代器
c.end()             返回指向容器最后一个元素的迭代器

三、下面描述一下什么是迭代器

迭代器相当于指针,例如:

1
2
3
4
5
// 对于变量而言,使用指针指向对应的变量
// 以后就可以使用 * 加指针来操作该变量了
int a = 10;
int *p;
p = &a;

使用指针操作该变量
例如: *p = 11; // 操作后a变为 11
对于容器,使用迭代器操作容器中对应位置的值
当迭代器指向了容器中的某位置,则可以使用 * 加迭代器操作该位置了

1
2
3
4
5
6
7
// 定义一个vector
std::vector<int> myVec;
//添加10个元素
for(int j =0 ; j<10 ; j++)
{
myVec.push_back(j);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 定义一个迭代器
std::vector<int>::iterator p;
// 指向容器的首个元素
p = myVec.begin();
// 移动到下一个元素
p ++;
// 修改该元素赋值
*p = 20 ; //< 则myVec容器中的第二个值被修改为了20
// 循环扫描迭代器,改变所有的值
p = myVec.begin();
for( ; p!= myVec.end(); p++ )
{
*p = 50;
}

以上简单讲述了vector的用法,仅供入门之用,下面以实例形式继续加以说明。

1.vector 的数据的存入和输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>
#include<vector>
#include <iostream>
using namespace std;
void main()
{
 int i = 0;
  vector<int> v;
  for( i = 0; i < 10; i++ )
 {
      v.push_back( i );//把元素一个一个存入到vector中
 }
  //对存入的数据清空
 for( i = 0; i < v.size(); i++ )//v.size() 表示vector存入元素的个数
 {
     cout << v[ i ] << " "; //把每个元素显示出来
 }
 cont << endl;
}

注:你也可以用v.begin()和v.end() 来得到vector开始的和结束的元素地址的指针位置。

你也可以这样做:

1
2
3
4
5
vector<int>::iterator iter;
for( iter = v.begin(); iter != v.end(); iter++ )
{
  cout << *iter << endl;
}

2. 对于二维vector的定义。
1)定义一个10个vector元素,并对每个vector符值1-10。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<stdio.h>
#include<vector>
#include <iostream>
using namespace std;
void main()
{
int i = 0, j = 0;
//定义一个二维的动态数组,有10行,每一行是一个用一个vector存储这一行的数据。
//所以每一行的长度是可以变化的。之所以用到vector<int>(0)是对vector初始化,否则不能对vector存入元素。
vector< vector<int> > Array( 10, vector<int>(0) );
for( j = 0; j < 10; j++ )
{
 for ( i = 0; i < 9; i++ )
 {
  Array[ j ].push_back( i );
 }
}
for( j = 0; j < 10; j++ )
{
 for( i = 0; i < Array[ j ].size(); i++ )
 {
  cout << Array[ j ][ i ] << " ";
 }
 cout<< endl;
}
}

2)定义一个行列都是变化的数组。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<stdio.h>
#include<vector>
#include <iostream>
using namespace std;
void main()
{
int i = 0, j = 0;
vector< vector<int> > Array;
vector< int > line;
for( j = 0; j < 10; j++ )
{
 Array.push_back( line );//要对每一个vector初始化,否则不能存入元素。
 for ( i = 0; i < 9; i++ )
 {
  Array[ j ].push_back( i );
 }
}
for( j = 0; j < 10; j++ )
{
 for( i = 0; i < Array[ j ].size(); i++ )
 {
  cout << Array[ j ][ i ] << " ";
 }
 cout<< endl;
}
}

使用 vettor erase 指定元素,示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include "iostream"
#include "vector"
using namespace std;
int main()
{
  vector<int> arr;
  arr.push_back(6);
  arr.push_back(8);
  arr.push_back(3);
  arr.push_back(8);
  for(vector<int>::iterator it=arr.begin(); it!=arr.end(); )
  {
    if(* it == 8)
    {
      it = arr.erase(it);
    }
    else
    {
      ++it;
    }
  }
  cout << "After remove 8:\n";
  for(vector<int>::iterator it = arr.begin(); it < arr.end(); ++it)
  {
    cout << * it << " ";
  }
  cout << endl;
}

第五章第二例题关于Vector(LRJ)的更多相关文章

  1. 《学习OpenCV》练习题第五章第二题abc

    代码: #include <stdio.h> #include <opencv/highgui.h> #include <opencv/cv.h> #include ...

  2. 第五章——支持向量机(Support Vector Machines)

    svm可用于线性或非线性分类.回归.甚至异常检测. svm尤其适用于中小数据集的复杂分类问题. 5.1 Linear SVM Classification svm对feature scales敏感,如 ...

  3. C# Language Specification 5.0 (翻译)第五章 变量

    变量(variable)表示存储的位置.每个变量都有类型,类型决定变量保存的值的类型.C# 是一门类型安全的语言,C# 编译器会确保变量中保存一个适合类型的值.变量的值可通过赋值或通过使用 ++ 与 ...

  4. Javascript权威指南——第二章词法结构,第三章类型、值和变量,第四章表达式和运算符,第五章语句

    第二章 词法结构 一.HTML并不区分大小写(尽管XHTML区分大小写),而javascript区分大小写:在HTML中,这些标签和属性名可以使用大写也可以使用小写,而在javascript中必须小写 ...

  5. Gradle 1.12用户指南翻译——第二十五章. Scala 插件

    其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...

  6. “全栈2019”Java多线程第二十五章:生产者与消费者线程详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  7. “全栈2019”Java第二十五章:流程控制语句中循环语句while

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  8. o'Reill的SVG精髓(第二版)学习笔记——第五章

    第五章 文档结构 5.1 结构与表现 XML的目标之一便是提供一种能将结构从视觉表示中独立出来的方法. 但是不幸的是,关于XML的很多讨论都强调结构而非表现. 我们将通过详细讨论如何在SVG中指定表现 ...

  9. 重温《STL源码剖析》笔记 第五章

    源码之前,了无秘密  ——侯杰 序列式容器 关联式容器 array(build in) RB-tree vector set heap   map priority-queue multiset li ...

随机推荐

  1. php 读取excel表格中的内容

    <?php /** * excel表格内容在网页中显示 * * 首先需要下载PHPExcel 工具包 * 网址: http://phpexcel.codeplex.com/releases/vi ...

  2. https 页面中引入 http 资源的解决方式

    相对协议 应用场景 浏览器默认是不允许在 https 里面引用 http 资源的,一般都会弹出提示框. 用户确认后才会继续加载,用户体验非常差. 而且如果在一个 https 页面里动态的引入 http ...

  3. win 2012 修改盘符

           开始--运行   diskmgmt.msc    ........

  4. 从零开始HTML(一 2016/10/17)

    就是准备跟着霹雳猿教程过一遍HTML啦,边看边记录更便于理解记忆吧~ 1.属性 HTML 标签可以拥有属性.属性提供了有关 HTML 元素的更多的信息.属性总是以名称/值对的形式出现,比如:name= ...

  5. 《深入理解bootstrap》读书笔记:第三章 CSS布局

    一. 概述一下理念 bootstrap基于H5开发.提倡移动先行(媒询声明是必须的),对浏览器支持面不是很广. 响应式图片:max-width:100% height:auto; 可以加上:.img- ...

  6. c++vector(入门级)

    #include<iostream> #include<fstream>> #include<vector> using namespace std; voi ...

  7. VC----文件图标和窗口图标及在任务栏显示的图标

    WNDCLASSEX wndcls; wndcls.cbSize=sizeof(wndcls); wndcls.cbClsExtra=0; wndcls.cbWndExtra=0; wndcls.hb ...

  8. XtraFinder到底好在哪里(标签、隐藏文件、路径拷贝与显示、从这里启动)

    类似Chrome的标签 自定义工具栏可添加一个快速显示与隐藏当前目录隐藏文件的功能 拷贝路径 cd 到当前目录这个功能跟PathFinder7类似 当然还有其他很多功能,比如这个返回上级目录,

  9. HTML5 web Form表单验证实例

    HTML5 web Form 的开发实例! index.html <!DOCTYPE html> <html> <head> <meta charset=&q ...

  10. ImageTragick Exploit & Fix

    ImageMagick是一款广泛流行的图像处理软件,有无数的网站(国内国外都有)使用它来进行图像处理,本周二,ImageMagick披露出了一个严重的0day漏洞,此漏洞允许攻击者通过上传恶意构造的图 ...