C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用
摘要
本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解。即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动态数组)STL vector进行分析和总结。
引言
因为前段时间对台大的机器学习基石和技法课程进行了学习,发如今详细的实现中经常涉及到各种类型的数据结构,比方线性表、二叉树、图等,在使用这些数据结构时感到有些吃力。主要是对一些主要的数据结构理解的不够。所以趁着暑假假期。近期一段时间总会抽出时间复习一下数据结构。參考的教材是王立柱编著的《C/C++与数据结构》,在详细的应用中採用的是C++标准模板库STL中相应实现的数据结构,主要參考的是MSDN文档。
正文
基本数据结构
数据结构中最简单的一个实现就是线性表中的顺序表,其数据结构如图所看到的:
数据结构上的实现为:
typedef struct
{
DataType *m_pData;
int m_nMax,m_nSize;
}SeqList;
typedef int DataType;
从结构上看。顺序表就是一个动态数组,须要有一个容量为m_nMax和一个用来记录表中已经有多少数据的m_nSize。而动态数组的容量在执行过程中是能够扩充和缩减的。因此也就比单纯的数组具有更加灵活的结构!
顺序表在C++的标准模板库中的实现
相应在C++的STL标准模板库中的实现是模板 vector:
<span style="font-size:18px;">template <
class Type,
class Allocator = allocator<Type>
>
class vector</span>
当中。Type是vector中存储的数据类型。使用时要包含头文件<vector>和命名空间std。
vector模板类中使用的数据类型
首先先认识一下vector模板类中最常使用的数据类型:
iterator 迭代器
用来提供对vector中元素随机訪问的一个数据类型,可读可改动。
const_iterator 常量迭代器
用来提供对vector中元素随机訪问。仅仅能读一个const不变的元素。
详细使用例如以下:
<span style="font-size:18px;">// vector_begin.cpp
// compile with: /EHsc
#include <vector>
#include <iostream> int main()
{
using namespace std;
vector<int> c1;
vector<int>::iterator c1_Iter;
vector<int>::const_iterator c1_cIter; c1.push_back(1);
c1.push_back(2); cout << "The vector c1 contains elements:";
c1_Iter = c1.begin();
for (; c1_Iter != c1.end(); c1_Iter++)
{
cout << " " << *c1_Iter;
}
cout << endl; cout << "The vector c1 now contains elements:";
c1_Iter = c1.begin();
*c1_Iter = 20;
for (; c1_Iter != c1.end(); c1_Iter++)
{
cout << " " << *c1_Iter;
}
cout << endl; // The following line would be an error because iterator is const
// *c1_cIter = 200;
}</span>
vector模板类的成员函数
assign
擦除改vector,并复制详细的元素到这个矢量中。
<span style="font-size:18px;">// vector_assign.cpp
// compile with: /EHsc
#include <vector>
#include <iostream> int main( )
{
using namespace std;
vector<int> v1, v2, v3;
vector<int>::iterator iter; v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
v1.push_back(40);
v1.push_back(50); cout << "v1 = " ;
for (iter = v1.begin(); iter != v1.end(); iter++)
cout << *iter << " ";
cout << endl; v2.assign(v1.begin(), v1.end());
cout << "v2 = ";
for (iter = v2.begin(); iter != v2.end(); iter++)
cout << *iter << " ";
cout << endl; v3.assign(7, 4) ;
cout << "v3 = ";
for (iter = v3.begin(); iter != v3.end(); iter++)
cout << *iter << " ";
cout << endl;
}</span>
输出为:
v1 = 10 20 30 40 50
v2 = 10 20 30 40 50
v3 = 4 4 4 4 4 4 4
front和back
分别返回vector中第一个和最后一个元素的引用。使用案比例如以下:
<span style="font-size:18px;">// vector_back.cpp
// compile with: /EHsc
#include <vector>
#include <iostream> int main() {
using namespace std;
vector <int> v1; v1.push_back( 10 );
v1.push_back( 11 ); int& i = v1.back( );
const int& ii = v1.front( ); cout << "The last integer of v1 is " << i << endl;
i--;
cout << "The next-to-last integer of v1 is "<< ii << endl;
}</span>
输出为:
The last integer of v1 is 11
The next-to-last integer of v1 is 10
其它操作函数
swap在两个vector之间交换元素;size获取表中数据的个数;resize又一次调整vector的数据个数;reserve保留一个最小长度的存储空间;push_back(size加1)和pop_back(size-1)实现的是在vector尾部插入和删除数据;insert在特定的位点插入一个或很多元素。erase擦掉一个或者一段范围内的元素。
clear是擦除整个vector中的元素(size=0)。
重载运算符
[]使得vector能够像数组一样訪问。=使得vector能够直接用右边的矢量去替换,而不用对左边进行存储空间的初始化等操作。
其它注意事项和使用经验
有了以上的说明,我们在使用时,还须要知道一下的几种初始化,vector嵌套的定义和使用小技巧等:
vector<vector<float>> test = vector<vector<float>>(5,vector<float>(6, 0.0f));
这样就初始化了一个二维的float 型 vector。如今test里面装有5个float型的vector<float>,而这个float型的vector<float>又被初始化为6个0.0f的一维vector。
在C++中常用引用&作为函数的形參。比方vectorMutiply(vector<float>& x1, vector<float>& x2)。
定义完vector,没有进行初始化操作,直接採用push_back()的方法能够进行插入,vector的最大存储空间capacity会动态的添加。用户不须要进行手动的调整。另外,能够直接利用等号=进行copy赋值操作。它的空间会系统自己主动分配。
C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用的更多相关文章
- C++的标准模板库STL中实现的数据结构之链表std::list的分析与使用
摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解,即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第二篇.主要针对线性表中的链表 ST ...
- 实验8 标准模板库STL
一.实验目的与要求: 了解标准模板库STL中的容器.迭代器.函数对象和算法等基本概念. 掌握STL,并能应用STL解决实际问题. 二.实验过程: 完成实验8标准模板库STL中练习题,见:http:// ...
- 标准模板库(STL)学习探究之vector容器
标准模板库(STL)学习探究之vector容器 C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...
- C++ 标准模板库(STL)
C++ 标准模板库(STL)C++ STL (Standard Template Library标准模板库) 是通用类模板和算法的集合,它提供给程序员一些标准的数据结构的实现如 queues(队列), ...
- STL学习系列之一——标准模板库STL介绍
库是一系列程序组件的集合,他们可以在不同的程序中重复使用.C++语言按照传统的习惯,提供了由各种各样的函数组成的库,用于完成诸如输入/输出.数学计算等功能. 1. STL介绍 标准模板库STL是当今每 ...
- 标准模板库--STL
标准模板库STL 1.泛型程序设计 C++ 语言的核心优势之一就是便于软件的重用 C++中有两个方面体现重用: 1.面向对象的思想:继承和多态,标准类库 2.泛型程序设计(generic progra ...
- C++ 标准模板库STL 队列 queue 使用方法与应用介绍
C++ 标准模板库STL 队列 queue 使用方法与应用介绍 queue queue模板类的定义在<queue>头文件中. 与stack模板类很相似,queue模板类也需要两个模板参数, ...
- 标准模板库(STL)学习探究之stack
标准模板库(STL)学习探究之stack queue priority_queue list map/multimap dequeue string
- cb22a_c++_标准模板库_STL_map_multimap红黑树(数据结构)关联容器
cb22a_c++_标准模板库_STL_map_multimap红黑树(数据结构)关联容器map(映射,key不能重复,一对一对的,value_type(1, "one")),mu ...
随机推荐
- poj3414 Pots (BFS)
Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12198 Accepted: 5147 Special J ...
- nyoj 题目12 喷水装置(二)
喷水装置(二) 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的 ...
- HDU6438 Buy and Resell 解题报告(一个有趣的贪心问题的严格证明)
写在前面 此题是一个很容易想到的贪心题目,但是正确性的证明是非常复杂的.然而,目前网上所有题解并未给出本题贪心算法的任何正确性证明,全部仅停留在描述出一个贪心算法.本着对算法与计算机科学的热爱(逃), ...
- ThreadPool学习草稿1
原文发布时间为:2010-10-27 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Collections.Generic;using Syste ...
- SQL索引基础
原文发布时间为:2011-02-19 -- 来源于本人的百度文章 [由搬家工具导入] 一、深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索 ...
- js, lambada? 在chrome和node下可以使用
var a=function(a,c){if(a)c(a)} undefined a(true,(console.log)) VM177:2 Uncaught TypeError: Illegal i ...
- OpenGL入门学习(二)
http://developer.178.com/201103/94954661733.html 一.点.直线和多边形我们知道数学(具体的说,是几何学)中有点.直线和多边形的概念,但这些概念在计算机中 ...
- xammp无法启动apache 由于80端口引起的问题 摘自百度经验
启动过程提示: 15:33:05 [Apache] Problem detected!15:33:05 [Apache] Port 80 in use by "Unable to open ...
- 记录: 一次解决整型溢出攻击(使用scala,隐式转换)
最近项目遇到一次整型溢出攻击 有一个功能,玩家购买num个物品. 每个物品花费14货币. 客户端限制玩家只能购买 1-9999个该物品. 但是某玩家通过技术手段,获得了客户端的运行权限. 于是发送协议 ...
- LeetCode OJ-- Letter Combinations of a Phone Number ***
https://oj.leetcode.com/problems/letter-combinations-of-a-phone-number/ 使用递归,深搜,使用 map 保存已经处理过的结果 cl ...