文档章节

STL vector 介绍连载1-2-3

天远
 天远
发布于 2012/05/20 16:22
字数 2173
阅读 149
收藏 0

STL简介:
STL = Standard Template Library,标准模板库,惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。这可能是一个历史上最令人兴奋的工具的最无聊的术语。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。STL现在是C++的一部分,因此不用额外安装什么。
STL被内建在你的编译系统之内。
在C++标准中,STL被组织为下面的13个头文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。

STL一般包括六大组件:
容器,算法,迭代器,仿函式,配接器,配置器。

vector简介:
vector是C++标准模板库中的部分内容,中文偶尔译作“容器”,但并不准确。它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。

 

/*- ==========================================================
*     文件名  :vector1.cpp
*     开发人员:袁培荣
*     当前版本:1.0.0.2595
*     创建时间:2012-05-20
*     修改时间:2012-05-20
*     功能说明:STL vector 介绍连载1
*     版权说明:版权所有 袁培荣 YuanPeirong 
*     编译环境:Windows 7(x64) SP1 简体中文专业版
*     编译器:  Visual Studio 2010 SP1(中文旗舰版)
                MinGW 20120426 GNU GCC 4.6.2(主力编译器)
                Visual C++ 6.0 SP6(中文企业版)
- ==========================================================*/

#include <iostream>
#include <vector>  //包含STL 的vector 头文件才能使用vector

using std::cout;
using std::endl;
using std::vector; //vector是一个类模板,定义在命名空间std里面

int main(int argc, char* argv[])
{
    //vector类的四种构造方法
    vector<int> v1;       //默认构造函数,v1为空
    vector<int> v2(v1);   //v2构造为v1的一个副本
    vector<int> v3(10,5); //v3包含10个值为5的元素
    vector<int> v4(10);   //v4包含含有初始化值的元素的10个副本
    
    //用.size()成员函数取得各vector对象包含的元素个数,并输出
    vector<int>::size_type l1=v1.size(); //.size()函数的返回类型为:
    vector<int>::size_type l2=v2.size(); //vector<T>::size_type
    vector<int>::size_type l3=v3.size(); //不过也可以用int型来接收
    vector<int>::size_type l4=v4.size(); //但建议用标准类型vector<T>::size_type

    cout<<"l1="<<l1<<endl;
    cout<<"l2="<<l2<<endl;
    cout<<"l3="<<l3<<endl;
    cout<<"l4="<<l4<<endl;
    
    //输出各vector对象包含的元素的值
    vector<int>::size_type i;
    
    cout<<endl<<"输出v1值"<<endl;
    for(i=0; i!=v1.size(); i++)     //C++程序员习惯于!=来进行判断
        cout<<v1[i]<<" ";           //而非<或>或<=或>=
                                    //这种用!=的方式更加科学和安全
    cout<<endl<<"输出v2值"<<endl;   //这里,虽然v1,v2是空的
    for(i=0; i!=v2.size(); i++)     //但for循环不会出错
    cout<<v2[i]<<" ";               //只是循环体一次也不执行就结束for循环
    
    cout<<endl<<"输出v3值"<<endl;
    for(i=0; i!=v3.size(); i++)    
        cout<<v3[i]<<" ";           //另外,我们可以通过 对象名[下标]
                                    //的方法来访问vector对象中各元素的值
    cout<<endl<<"输出v4值"<<endl;   //下标从0开始,到 长度-1 结束
    for(i=0; i!=v4.size(); i++)     
        cout<<v4[i]<<" ";
        
    v3[5]=35;                      //对象名[下标] 的方式可作右值,也可作左值
    cout<<endl<<"v3[5]="<<v3[5]<<endl;
    
    return 0;
}

//=========================
// 运行结果:
//=========================
// l1=0
// l2=0
// l3=10
// l4=10

// 输出v1值

// 输出v2值

// 输出v3值
// 5 5 5 5 5 5 5 5 5 5 
// 输出v4值
// 0 0 0 0 0 0 0 0 0 0 
// v3[5]=35
//=========================
/*- ==========================================================
*     文件名  :vector2.cpp
*     开发人员:袁培荣
*     当前版本:1.0.0.2595
*     创建时间:2012-05-20
*     修改时间:2012-05-20
*     功能说明:STL vector 介绍连载2
*     版权说明:版权所有 袁培荣 YuanPeirong 
*     编译环境:Windows 7(x64) SP1 简体中文专业版
*     编译器:  Visual Studio 2010 SP1(中文旗舰版)
                MinGW 20120426 GNU GCC 4.6.2(主力编译器)
                Visual C++ 6.0 SP6(中文企业版)
- ==========================================================*/

#include <iostream>
#include <vector>  //包含STL 的vector 头文件才能使用vector

using std::cout;
using std::endl;
using std::vector; //vector是一个类模板,定义在命名空间std里面

int main(int argc, char* argv[])
{
    vector<int> v1;
    vector<int> v2(10);

    //.empty()成员函数返回对象是否是空的
    bool bv1=v1.empty(); //如果为空,返回ture
    bool bv2=v2.empty(); //如果不为空,返回flase
    cout<<"测试empty()成员函数"<<endl;
    if(bv1) 
        cout<<"v1是空的"<<endl;
    else
        cout<<"v1不是空的"<<endl;

    if(bv2) 
        cout<<"v2是空的"<<endl;
    else
        cout<<"v2不是空的"<<endl;

    // "==" 操作符用来判断两个对象是否相等        
    // 同时 !=, <, >, <=, >=这些操作符保持有惯有含义 
    cout<<"测试 == 操作符"<<endl;
    if(v1==v2)
        cout<<"v1与v2相同"<<endl;   //如果相等返回true
    else
        cout<<"v1与v2不相同"<<endl; //如果不相等返回false    
        

    //"=" 操作符可用于对象间赋值
    v1=v2; //把v1的元素替换为v2中的元素的副本
           //此时v1不再为空,而是和v2相等,证明如下
    bv1=v1.empty();
    cout<<"测试 = 操作符"<<endl;    
    if(bv1) 
        cout<<"v1是空的"<<endl;
    else
        cout<<"v1不是空的"<<endl;
    if(v1==v2)
        cout<<"v1与v2相同"<<endl;   
    else
        cout<<"v1与v2不相同"<<endl;
        
    return 0;
}

//=========================
// 运行结果:
//=========================
// 测试empty()成员函数
// v1是空的
// v2不是空的
// 测试 == 操作符
// v1与v2不相同
// 测试 = 操作符
// v1不是空的
// v1与v2相同
//=========================

/*- ==========================================================
*     文件名  :vector3.cpp
*     开发人员:袁培荣
*     当前版本:1.0.0.2595
*     创建时间:2012-05-20
*     修改时间:2012-05-20
*     功能说明:STL vector 介绍连载3
*     版权说明:版权所有 袁培荣 YuanPeirong 
*     编译环境:Windows 7(x64) SP1 简体中文专业版
*     编译器:  Visual Studio 2010 SP1(中文旗舰版)
                MinGW 20120426 GNU GCC 4.6.2(主力编译器)
                Visual C++ 6.0 SP6(中文企业版)
- ==========================================================*/

#include <iostream>
#include <vector>  //包含STL 的vector 头文件才能使用vector

using std::cout;
using std::endl;
using std::vector; //vector是一个类模板,定义在命名空间std里面

int main(int argc, char* argv[])
{
    vector<int> v1(1);
    vector<int> v2(10);

    //下标操作不能用于添加元素,因为下标越界不允许
    //下面是演示,因为是错误代码,因为被注释
    //下面想通过下标操作为v1加入5个元素,这是非法的
    //而且这种错误在编译时是不报错的,但在运行时会出错
    //显然这种错误更可怕
    //=====错误代码起
    // for(vector<int>::size_type i=1; i!=6; i++)
        // v1[i]=i;
    //=====错误代码止
    //其实这种错误就是下标越界
    //因为v1只存在 v1[0] 而v1[1]到v[5]是不存在的,因为是不能访问的
    //因为系统没有为它们分配内存空间,根本访问不到
    
    //正确添加元素,我们要用到.push_back(t)成员函数
    //.push_back(t)接受一个元素值t,并将其添加到对象的最后面
    cout<<"测试push_back(t)成员函数"<<endl;
    cout<<"添加前:"<<endl;
    cout<<"v1[0]="<<v1[0]<<endl;
    for(vector<int>::size_type j=1; j!=6; j++)
    {    
        v1.push_back(j);
        cout<<"添加v1["<<j<<"]="<<v1[j]<<endl;
    }
    
    return 0;
}

//=========================
// 运行结果:
//=========================
// 测试push_back(t)成员函数
// 添加前:
// v1[0]=0
// 添加v1[1]=1
// 添加v1[2]=2
// 添加v1[3]=3
// 添加v1[4]=4
// 添加v1[5]=5
//=========================

//=========================
//总结:
//=========================
//vector是C++标准中STL组件的核心内容之一
//它采用最新的泛型编程技术实现,其本质是一个类模板
//vector可以用来替换不安全的数组操作
//并且它可以动态的增减元素
//(这里没有演示减,主要是要和后面的迭代器一起介绍)
//这是数组所不能做到的。
//相比JAVA的vector的增减机制,C++的vector更加灵活和科学
//数组可以配合指针进行灵活操作,这一点Java的数组不行
//而C++的vector可以配合迭代器进行更灵活操作,这一点Java的vector不行
//C++的vector和迭代器可以很好地替代不安全的数组和指针
//我们在编程时要尽量不用数组,能用迭代器的地方可用其代替指针
//而尽可能的采用vector和迭代器
//当然,数组可以不用,指针还是不能被取代的
//C++99标准的推出了智能指针
//而C++11标准更是推出了两个更加智能的指针 
//=========================
//接下去,将介绍迭代器和vector的配合使用。
//=========================

© 著作权归作者所有

共有 人打赏支持
天远
粉丝 4
博文 37
码字总数 37240
作品 0
宁波
架构师
私信 提问
C++ STL学习——vector

学过C++的人肯定会很熟悉STL标准模板库,STL其实就是封装了一系列的接口,供我们调用。很多函数或者算法的实现不需要我们从头开始写,大大提高我们的编程效率。这篇博客在简单介绍STL的情况下...

chenyufeng1991
2016/08/21
0
0
C++ Primer 学习笔记(第三章:字符串、向量和数组)

C++ Primer 学习笔记(第三章:字符串、向量和数组) [TOC] 3.1 命名空间的声明 声明语句可以一行放多条。 位于头文件的代码,一般来说不应该使用声明。因为其内容会拷贝到每个使用该头文件的...

ShawnLue
2015/08/20
0
0
STL简单序列式容器的使用(vector、list、stack、queue)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/triorwy/article/details/80734849 更多知识点这里C++学习 - 目录索引 1:STL的起源 2:STL历史 3:vector容器的...

Triorwy
06/19
0
0
在eclipse用gdb调试stl容器配置

在eclipse中安装cdt插件写c++代码时常用到gdb调试 但是对于vector,map等等stl中内容,调试时只能显示开始和结束时的地址信息,非常不友好。 研究了老一阵子,终于配置成功了,下边介绍下配置...

zmldndx
2013/04/10
0
0
Effective STL - 容器

STL(standard template library)提供了一组表示容器,迭代器,函数对象和算法的模板。容器是一个与数组类似的单元,可以存若干个值。 STL容器是同质的,即存储的值的类型相同;算法是完成特...

積木leayn
2013/10/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

《碎玉投珠》的读后感想法心得范文3800字

《碎玉投珠》的读后感想法心得范文3800字: 《碎玉投珠》是晋江作者北南2018年的作品,内容主要讲述了其17年的《两小无嫌猜》中副cp师父师叔的爱情故事。 个人并没有看过北南其他的作品,这篇...

原创小博客
28分钟前
0
0
Confluence 6 文档主题合并问答

在 Confluence 官方 前期发布的消息 中,文档主题在 Confluence 6.0 及其后续版本中已经不可用。我们知道你可能对这个有很多好好奇的问题,因此我们在这里设置了一个问答用于帮助你将这个主题...

honeymose
40分钟前
2
0
java框架学习日志-2

上篇文章(java框架学习日志-1)虽然跟着写了例子,也理解为什么这么写,但是有个疑问,为什么叫控制反转?控制的是什么?反转又是什么? 控制其实就是控制对象的创建。 反转与正转对应,正转...

白话
今天
6
0
Integer使用双等号比较会发生什么

话不多说,根据以下程序运行,打印的结果为什么不同? Integer a = 100;Integer b = 100;System.out.println(a == b);//print : trueInteger a = 200;Integer b = 200;System.out.pr...

兜兜毛毛
昨天
11
0
CockroachDB

百度云上的CockroachDB 云数据库 帮助文档 > 产品文档 > CockroachDB 云数据库 > 产品描述 开源NewSQL – CockroachDB在百度内部的应用与实践 嘉宾演讲视频及PPT回顾:http://suo.im/5bnORh ...

miaojiangmin
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部