上篇中遗留了一个小作业,就是用string中的find_first_not_of和find_last_not_of函数来实现字符串左右空格的去除,先来完成它,实现的思路是先来编写去除左空格,然后再编写去除右空格,最后去除左右空格则去调用前面两个方法既可,先来编写一个去除空格的工具类:

StringUtil.h:

#ifndef _STRING_UTIL_H_
#define _STRING_UTIL_H_ #include <string>
using namespace std; class StringUtil
{
public:
static void Ltrim(string& s);//去除左空格
static void Rtrim(string& s);//去除左空格
static void Trim(string& s);//去除左右空格
}; #endif

下面来一一对其进行实现,先来实现去除左空格,如何实现呢?

这里需要用到string中的一个函数:

那去除右空格则比较简单了,这里使用erase的另外一种形式:

那去除左右空格就直接调用上面两个方法既可:

下面编写测试代码来验证一下:

下面正式开始vector的学习:

  • vector是同一种类型的对象的集合。
  • vector的数据结构很像数组,能非常高效和方便地访问单个元素。
  • vector是一个类模板(class template)。
  • 要使用vector必须包含相关头文件
    #include <vector>
    using std::vector;

【注意】:它的空间是连续的,但是是可以动态扩展的,也叫动态数组,貌似有点矛盾,至于这是怎么实现的,等之后学STL时再来剖析,目前先了解它的使用既可。

vector类定义了好几种构造函数:

  • vector<T>  v1;//vector保存类型为T的对象。默认构造函数v1为空
  • vector<T> v2(v1);// v2是v1的一个副本
  • vector<T> v3(n, i);//v3包含n个值为i的元素
  • vector<T> v4(n);//v4含有值初始化的元素的n个副本

对于string它的类型是basic_string<char>,而vector<T>也是一种类型,它的具体使用如下:

实际上也可以像string一样将它再定义一下,方便使用:

接下来往里面添加元素:

接着如何将添加的元素打印出来呢?

编译运行:

有警告,这是为什么呢?

说明是无符号类型的,所以修改代码:

编译运行:

对于这段显示的代码可以提取到一个函数中以便之后使用:

另外还有其它显示方式:利用迭待器【只要是容器都可以用迭待器】,具体如下:

#include <vector>
#include <iostream>
using namespace std; typedef vector<int> INTVEC; //void showVector(const INTVEC& v) {
// unsigned int i;
// for(i = 0; i < v.size(); i++) {
// cout<<v[i]<<" ";
// }
// cout<<endl;
//} void showVector(INTVEC& v) {
INTVEC::iterator it;//迭待器可以看成是泛型程序指针,什么是泛型未来会学习,了解一下既可
for(it = v.begin(); it != v.end(); ++it) {
cout<<*it<<" ";
}
cout<<endl;
} int main(void) { //vector<int> v;
INTVEC v;
v.push_back();
v.push_back();
v.push_back(); showVector(v); return ;
}

关于上面的代码有两个疑点:

①、为什么不有<而用!=?

因为并不是所有的容器都实现了<运算符重载,但是!=是所有容器都实现了的,为了让程序有更好的可移植性,所以需要用!=

②、为什么用++it,而不用it++?

原因是由于性能没有++it好,在学习运算符重载时,我们实现了一个Integer,可以查看一下后置++的实现代码:

所以为了更加高效,则采用前置++。

但是最好还是采用常量来显示:

编译运行:

这是由于迭待器这时也得换成常量的了,不然就报错了,修改代码如下:

这时就可正常显示了,但是需要注意的是:这时不能对数据进行修改了,如下这样写是错误的:

编译:

在学习这个函数之前,有一个类似的函数,但是两者有巨大的区别,先来看下:

也就是说back()只是取出最后一个元素,并不会从容器中弹出。

而如果用pop_back()当然就会弹出喽:

记得sring中也有这个函数,下面来使用一下:

编译运行:

它还有另外一种形式:

如果想移除容器中值等于某个值的元素,那怎么弄呢?如下:

编译运行:

因为这个方法是属于算法的,所以需要包含算法头文件:

再次编译运行:

貌似没有将等于3的元素移除呀,remove方法并不能真正移除,它只是让元素进行了移位而已,这是因为还少一步操作,如下:

再来看结果:

成功删除,至于为什么能够删除,等之后学到STL之后再来剖析,先学习使用既可,除了利用系统的这个remove方法可以删除之后,还有其它的方式能达到目的么,当然:利用迭待器:

编译运行:

这是为啥呢?分析下代码:

所以需要调整代码了:

再次编译运行:

这种方式也同样适用下节要介绍的map容器~

标准库类型之vector的更多相关文章

  1. C++ 标准库类型-String,Vector and Bitset

    <C++ Primer 4th>读书摘要 最重要的标准库类型是 string 和 vector,它们分别定义了大小可变的字符串和集合.这些标准库类型是语言组成部分中更基本的那些数据类型(如 ...

  2. C++ Primer 第三章 标准库类型vector+迭代器iterator 运算

    1.vector: 标准库类型vector表示对象的集合,其中所有对象的类型都相同,集合中的每个对象都有一个与之对应的索引,索引用于访问对象.因为vector“容纳着”其他对象,所以它也常被称作容器( ...

  3. 标准库类型vector

    标准库类型vector表示对象的集合,其中所有对象的类型都相同.集合中的每个对象都有一个与之对应的索引,索引用于访问对象.因为vector“容纳着”其他对象,所以它被称为容器. 要想使用vector, ...

  4. C++ Primer笔记1_转义字符_标准库类型string_标准库类型vector

    1.转义字符 一般有两种方式: \x后紧跟1个或多个十六进制数字.或\后紧跟1.2.3个八进制数字,当中数字部分是字符相应的数值. #include <iostream> using na ...

  5. C++标准库类型vector及迭代器iterator简介

    Vector是C++标准库类型,称为容器,一个容器中的所有对象必须是同一种类型的.与数组相比,其最大的优点就是动态增长.Vector是一个类模板,并不是数据类型,而vector<int>和 ...

  6. 谈谈两种标准库类型---string和vector

    两种最重要的标准库---string和vector string和vector是两种最重要的标准库类型,string表示可变长的字符序列,vector存放的是某种给定类型对象的可变长序列. 一.标准库 ...

  7. C++primer第三章标准库类型

    除第二章介绍的基本数据类型外,C++ 还定义了一个内容丰富的抽象数据类型标准库. 本章将介绍标准库中的 vector.string 和 bitset 类型. string 类型支持长度可变的字符串 v ...

  8. C++拾遗(二)——初窥标准库类型

    本篇博文的开始,先介绍一道书上看到的智力题:有20瓶药丸,其中19瓶装有1克/粒的药丸,余下一瓶装有1.1克/粒的药丸.有一台称重精准的天平,只是用一次天平的情况下如何找出比较重的那瓶药丸? 好了,直 ...

  9. C++ Primer 第三章 标准库类型string运算

    1. 标准库类型 string string表示可变长的字符序列,使用string必须首先包含string头文件.如何初始化类的对象是由类本身决定的. int n; string s1;//默认初始化 ...

随机推荐

  1. c#关于Dictionary中自定义Key

    Dictionary 描述 字典 Dictionary 通过 Hash 桶算法进行O(1)查找数据,在 Hash 碰撞达到一定次数后会自动进行 Resize,也会在数组大小不足的时候会自动进行Resi ...

  2. es6 装饰器decorator的使用 +webpack4.0配置

    decorator 装饰器 许多面向对象都有decorator(装饰器)函数,比如python中也可以用decorator函数来强化代码,decorator相当于一个高阶函数,接收一个函数,返回一个被 ...

  3. ByteDance面试

    1.HashMap.HashSet源码解读 2.Http状态码.包头内容有哪些 响应头 说明 示例 状态 Access-Control-Allow-Origin 指定哪些网站可以跨域源资源共享 Acc ...

  4. mysql中mysql数据库丢失报错Can't open the mysql.plugin table

    180720 10:00:54 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it. 18 ...

  5. Django后台缓存运用,提高并发

    图片防盗链 -通过请求头refer控制 -nginx处理 提高网站并发的通用方法 QPS:每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准.衡量一个服务器能抗多大并发的重要 ...

  6. windows批量导出文件名到txt

    做图像处理时,经常会遇到训练数据样本,这个时候一般就会要一个保存了大量文件名txt文件作为数据的输入 windows系统中可以直接使用dir,具体使用可以直接打开windows的终端 输入 dir/? ...

  7. git简易指南

    目录 工作流 初始化仓库 查看分支 添加和提交 推送改动 分支 重命名分支 更新与合并 替换本地改动 回滚 远程仓库 有用的贴士 GIT vs SVN 工作流 你的本地仓库由 git 维护的三棵&qu ...

  8. Oracle的varchar2如何比较大小

    首先要说的是Oracle中字符类型的比较都是基于ASCII码表来实现的,我就简单做个总结. Oracle中varchar2类型的字符串使用的是非填充空格的标准来进行比较的(表格中右边的那列,注意空格的 ...

  9. Spring AOP 简介(三)

    Spring AOP 简介 如果说 IoC 是 Spring 的核心,那么面向切面编程就是 Spring 最为重要的功能之一了,在数据库事务中切面编程被广泛使用. AOP 即 Aspect Orien ...

  10. Android 卸载应用程序

    最近工作中接触Android应用实现卸载自身的逻辑,踩了一些坑之后整理下来.使用的方法是Intent.ACTION_DELETE,这里没有什么好说的. MainActivity.java : pack ...