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

两种最重要的标准库---string和vector

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

一、标准库类型string

  1.定义和初始化string对象:初始化string对象的方式有

    string s1   默认初始化,s1是一个空串   string s2(s1)   s2是s1的副本

    string s2=s1   等价于s2(s1),s2是s1的副本  

    string s3("value")  s3是字面值"value"的副本,除了字面值最后的那个空字符外

    string s3="value"  等价于s3("value"),s3是字面值"value"的副本  

    string s4(n,'c')  把s4初始化为由连续n个字符c组成的串

    如果使用等号(=)初始化一个变量,实际上执行的是拷贝初始化,编译器把等号右侧的初始值拷贝到心创建的对象中去。与之相反,如果

不使用等号,则执行的是直接初始化。

  2.string对象上的操作

    os<<s  将s写到输出流os当中,返回os    is>>s  从is中读取字符串赋给s,字符串以空白分隔,返回is

    getline(is,s)  从is中读取一行赋给s,返回is    s.empty()  s为空返回true,否则返回false

    s.size()  返回s中字符的个数    s[n]  返回s中第n个字符的引用,位置n从0计起

    s1+s2   返回s1和s2连接后的结果   s1=s2   用s2的副本代替s1中原来的字符

    s1==s2  s1!=s2  如果s1和s2中所含的字符完全一样,则他们相等;string对象的相等性判断对字母的大小写敏感

  读取未知数量的string对象

 

#include <iostream>
#include <string> using namespace std; int main() {string word;while(cin>>word)cout<<word<<endl;return 0; }

 

    使用getline()读取一整行:

         getline函数的参数是一个输入流和一个string对象,函数从给定的输入流中读入内容,直到遇到换行符为止(注意换行符也被读进来了),然后把所读的

    内容存入到那个string对象中去(注意不存换行符)。

#include <iostream>
#include <string>
using namespace std;
int main()
{string line;    //每次读入一整行,直到达文件末尾while(getline(cin,line))cout<<line<<endl;return 0;
}

    string的empty和size操作:

       empty函数根据string对象是否为空返回一个对应的布尔值,empty也是string的一个成员函数。

#include <iostream>
#include <string>
using namespace std;
int main()
{string line;while(getline(cin,line))   //每次读入一整行,遇到空行直接跳过if(!line.empty())cout<<line<<endl;return 0;
}

      size函数返回string对象的长度(即string对象中字符的个数)

#include <iostream>
#include <string>
using namespace std;
int main()
{string line;//每次读入一整行,输出其中超过100个字符的行while(getline(cin,line))if(line.size()>100)cout<<line<<endl;return 0;
}

   处理string对象中的字符:使用基于范围的for语句

        范围for语句:这种语句遍历给定序列中的每个元素并对序列中的每个值执行某种操作,

             for (declaration : expression)

                   statement

          其中,expression部分是一个对象,用于表示一个序列。declaration部分负责定义一个变量,该变量将被用于访问序列中的基础元素。每次迭代,

         declaration部分的变量会被初始化为expression的下一个元素值。

#include <iostream>
#include <string>
#include <ctype.h>
using namespace std;
int main()
{string s("hello world!!!");for (decltype(s.size()) index = 0;index != s.size() && !isspace(s[index]);++index)s[index] = toupper(s[index]);cout << s << endl;/*decltype(s.size()) punct_cnt = 0;for (auto c : s)if (ispunct(c))++punct_cnt;cout << punct_cnt<< " punctuation characters in "<< s << endl;*//*for (auto & c : s)c = toupper(c);cout << s << endl;*/getchar();return 0;
}

 二、标准库类型vector

     1. 标准库类型vector表示对象的集合,其中所有对象的类型都相同。集合中的每个对象都有一个与之对应的索引,索引用于访问对象。因为vector容纳着其他对象,

所以它也被称作容器。

      vector能容纳绝大多数类型的对象作为其元素,但是因为引用不是对象,所以不存在包含引用的vector。除此之外,其他大多数(非引用)内置类型和类类型都可

以构成vector对象,甚至组成vector的元素也可以是vector。

    2. 定义和初始化vector对象

    和任何一种类类型一样,vector模板控制着定义和初始化向量的方法。

    vector<T> v1    v1是一个空vector,它潜在的元素是T类型的,执行默认初始化     vector<T> v2(v1)    v2中包含有v1所有元素的副本

    vector<T> v2=v1   等价于v2(v1),v2中包含有v1所有元素的副本   vector<T> v3(n,val)   v3包含了n个重复的元素,每个元素的值都是val

    vector<T> v4(n)   v4包含了n个重复地执行了值初始化的对象   vector<T> v5{a,b,c...}  v5包含了初始值个数的元素,每个元素被赋予相应的初始值

    vector<T> v5={a,b,c...}    等价于v5{a,b,c...}

   3. vector支持的操作

    v.empty()  如果v不含有任何元素,返回真;否则返回假     v.size()  返回v中元素的个数

    v.push_back(t)   向v的尾端添加一个值为t的元素   v[n]  返回v中第n个位置上元素的引用

    v1=v2  用v2中元素的拷贝替换v1中的元素   v1={a,b,c...}  用列表中元素的拷贝替换v1中的元素

    v1==v2  v1和v2相等当且仅当它们的元素数量相同且对应位置的元素值都相同    v1!=v2  

   4. 向vector对象中添加元素

#include <iostream>
#include <vector>
using namespace std;
int main()
{vector<int> v;int a;while (cin >> a ,a!=-1)v.push_back(a);for(auto i : v)cout << i << endl;system("pause");return 0;
}

  5. 使用迭代器

    使用迭代器可以访问某个元素,迭代器也能从一个元素移动到另外一个元素。迭代器有有效和无效之分,这一点和指针差不多。有效的迭代器或者指向某个元素,或者

指向容器中尾元素的下一个位置;其他所有情况都属于无效。这些类型都拥有名为begin和end的成员,其中begin成员负责返回指向第一个元素(或第一个字符)的迭代器。

end成员则负责返回指向容器(或string对象)“尾元素的下一个位置”的迭代器,该迭代器指示的是容器的一个本不存在的“尾后”元素。end成员返回的迭代器常被称作尾后

迭代器或者简称为尾迭代器。特殊情况下如果容器为空,则begin和end返回的是同一个迭代器。

    标准容器迭代器的运算符:

       *iter   返回迭代器iter所指元素的引用     iter->mem  解引用iter并获取该元素的名为mem的成员,等价于(*iter).mem

       ++iter  令iter指示容器中的下一个元素     --iter  令iter指示容器中的上一个元素

       iter1==iter2   iter1 != iter2   判断两个迭代器是否相等(不相等),如果两个迭代器指示的是同一个元素或者它们是同一个容器的尾后迭代器,则相等;反之,不相等

#include <iostream>
#include <vector>
#include <string>
#include <ctype.h>
using namespace std;
int main()
{string s("some string");if (s.begin() != s.end()){auto it = s.begin();*it = toupper(*it);}cout << s << endl;system("pause");return 0;
}
#include <iostream>
#include <vector>
#include <string>
#include <ctype.h>
using namespace std;
int main()
{
   string s("some string");
   if (s.begin() != s.end()){for (auto it = s.begin();it != s.end() && !isspace(*it);++it)*it = toupper(*it);}cout << s << endl;system("pause");return 0;
}

     迭代器类型:拥有迭代器的标准库类型使用iterator和const_iterator来表示迭代器的类型。const_iterator和常量指针差不多,能读取但不能修改它所指的元素值。

相反,iterator的对象可读可写。如果vector对象或string对象是一个常量,只能使用const_iterator;如果vector对象或string对象不是常量,那么既能使用iterator也能

使用const_iterator。

   begin和end运算符:begin和end返回的具体类型由对象是否是常量决定,如果对象是常量,begin和end返回const_iterator;如果对象不是常量,返回iterator。为了

便于得到const_iterator类型的返回值,引入了两个新函数,分别是cbegin和cend,类似于begin和end,两个新函数也分别返回指示容器第一个元素或最后元素下一个

位置的迭代器。不同的是,不论vector对象(或string对象)本身是否是常量,返回值都是const_iterator。

#include <iostream>
#include <vector>
#include <string>
#include <ctype.h>
using namespace std;
int main()
{string s("some string");if (s.begin() != s.end())for (auto it = s.cbegin();it != s.cend() && !s.empty();++it)cout << *it;cout << endl;system("pause");return 0;
}

 

转载于:https://www.cnblogs.com/XNQC1314/p/8076240.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428365.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux编译ffmepg,在Ubuntu下编译FFmpeg

在之前&#xff0c;我们成功地使用mingwmsys在Windows平台下编译FFmpeg(见 http://www.linuxidc.com/Linux/2014-11/109839.htm)&#xff0c;并生成了ffplay.exe。现在再在Ubuntu平台上重新编译一次。相对于在Windows平台上编译需要的旷日持久而且异常艰难的工作&#xff0c;Ub…

C++为什么空格无法输出_47个快捷键、50个CAD技巧,终于知道为什么别人用CAD总比我快了!...

终于知道为什么别人用CAD总比我快了&#xff0c;原来他们早就掌握了这些实用的CAD技巧&#xff0c;还没看完我就默默地转了&#xff0c;总有用得到的时候。47个快捷键1. 创建直线的快捷方式是L空格2. 创建圆的快捷方式是C空格3. 创建圆弧的快捷方式是A空格4. 创建矩形的快捷方式…

Flume环境搭建_五种案例(转)

Flume环境搭建_五种案例 http://flume.apache.org/FlumeUserGuide.html A simple example Here, we give an example configuration file, describing a single-node Flume deployment. This configuration lets a user generate events and subsequently logs them to the con…

linux配置服务器超时退出,Linux下实现不活动用户登录超时后自动登出

摘要&#xff1a;方法一&#xff1a;通过修改.bashrc或.bash_profile文件来实现通过修改home目录下的.bashrc或.bash_profile文件...方法一&#xff1a;通过修改.bashrc或.bash_profile文件来实现通过修改home目录下的.bashrc或.bash_profile文件来实现。这两个文件选择其中一个…

只读属性怎么来的初值_设置Mysql表只读,关键时刻或许能救你一命

作为一名数据库运维人员&#xff0c;应该遇到过表记录被异常全表更新&#xff0c;这个时候该怎么办。作为Mysql数据库运维人员&#xff0c;第一反应&#xff0c;应该就是上报&#xff0c;然后联系开发人员&#xff0c;确认此表作用&#xff0c;然后再确定恢复方案。在这里举一个…

天龙架设linux环境配置,《果子资源》-天龙八部-手工纯端架设教程 - T-天龙八部 - Powered by Discuz!...

宝塔纯端架设天龙八部3D教程1.我这边使用CENOTS7 系统(6系统没时间测试)2.安装宝塔3.进入宝塔 安装MySQL5.5(我这边测试MYSQL 5.7 会创建不了角色) PHP 和NGINX3.进入SSH 输入yum install unixODBC -y4. 添加mysql账号账号: app_mtlbb密码: dskfjl29091dfk导入sql目录里的数据库…

mac安装需要的骚操作

显示隐藏文件defaults write com.apple.finder AppleShowAllFiles -bool true; KillAll Finder 允许任何来源sudo spctl --master-disable 安装command line toolsxcode-select --install 使用locatesudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.pl…

自动打包linux,Linux环境下Springboot自动打包发布功能

实现核心功能&#xff1a;完成Linux环境下Springboot自动打包发布功能详细功能&#xff1a;自动更新Svn最新代码删除原有打包文件自动打包将打包之后的项目文件复制到其他服务器关闭本地项目进程重新启动本地项目服务使用到的相关技术&#xff1a;SVN&#xff0c;Maven&#xf…

miui12怎么自定义开机动画_MIUI12正式发布:视觉/功能大升级

点击上方蓝字【安兔兔】关注我文章每天不断更&#xff01;在今天下午举行的线上发布上&#xff0c;小米正式发布了MIUI12系统。从官方描述来看&#xff0c;MIUI12可以说是MIUI近几年来最重磅的一次更新&#xff0c;在UI界面、动画以及功能等方面都作出了升级。按照官方说法&…

已触发了一个断点 vs_VSCode源码分析-断点调试

背景今年年初&#xff0c;有幸参与了阿里集团IDE 共建项目组&#xff0c;打造阿里生态体系内的公共IDE底层&#xff0c;而作为一款面向开发者的IDE&#xff0c;调试能力的支持一定程度上决定着一款IDE的开发体验&#xff1b;VSCode作为微软体系下一款当前最热的IDE开发工具&…

什么端口可以抓LINUX,linux下开启某个端口的方法:可用于SQL

php生成随机字符串SDUST 软件工程2016-作业4-A 百钱买鸡问题解决百钱买鸡问题原本并不困难,关键的是这道题对其进行了升级,测试数据太大,传统的解法,像三重循环,二重循环都会导致超时. 这道题正确的解法应该是结合数学方程进行化简,将其转化为1层循环: xyz ...BootStrap最常用的…

azure linux 磁盘,在Azure Linux VM中,还有什么?什么磁盘收费?

MikeWo..7我还没有使用过Linux的IaaS实例,但我想我可以根据我对基础设施如何工作的理解来回答其中一些问题.当您创建VM时,您拥有操作系统磁盘(它映射到上面的根目录,我相信启动也可以,但我认为这是一个基于Linux的工件,并且在使用Windows时不存在).此OS磁盘作为VHD,页面BLOB存储…

python网页爬虫循环获取_Python 爬虫第三篇(循环爬取多个网页)

本篇是 python 爬虫的第三篇&#xff0c;在前面两篇 Python 爬虫第一篇&#xff08;urllibregex&#xff09; 和 Python 爬虫第二篇&#xff08;urllibBeautifulSoup&#xff09; 中介绍了如何获取给定网址的网页信息&#xff0c;并解析其中的内容。本篇将更进一步&#xff0c;…

移动web——touch事件介绍

基本概念 1、在移动web端点击事件或者滑动屏幕、捏合等动作都是由touchstar、touchmove、touchend这三个事件组合在一起使用的 2、click事件在移动端会有0.2秒的延迟&#xff0c;下面是测试click在移动web端的延迟&#xff0c;最好在手机浏览器中测试 <script>window.onl…

如何计算一年总共有多少周_一年有几个周?怎么计算周数及闰年?

用这一年的天数除以7。因为一周有七天。分析过程如下&#xff1a;假设这一年是2018年&#xff0c;2018年是一个平年&#xff0c;因为2018/4504……2。平年的全年有365天&#xff0c;365752……1。由此可得2018年有52周多1天。扩展资料&#xff1a;闰年的计算方法&#xff1a;1、…

linux系统安装应用商店失败,在Deepin/UOS系统应用商店中安装KiCad失败的解决方法...

在Deepin/UOS系统应用商店中搜索并安装KiCad可能会提示安装失败&#xff0c;原因就是缺少必要的依赖包及KiCad的封装库文件。下面分享解决方法及附上Deepin系统安装KiCad5的方法。参考深度商店应用Inkscape、KiCad、MyPaint、中望CAD Linux预装版。解决方法在系统中通过终端执行…

在Oracle中利用SQL_TRACE跟踪SQL的执行

当你在执行一条SQL语句非常慢的时候,你是不是想问Oracle怎么执行这条语句的呢? Oracle提供的SQL_TRACE工具可以让你知道你执行的SQL究竟做了什么.执行的过程会被 输出到trace文件中. 下面用例子来跟踪一个SQL语句的执行情况: SQL> create table t as select rownum as id,o…

python可以测试java的代码吗_使用python做你自己的自动化测试--对Java代码做单元测试 (2)-导入第三方jar包裹...

使用Jython对Java做单元测试&#xff0c;当然&#xff0c;为了测试开发java代码。这涉及到引入第三包的问题&#xff0c;如何导入第三方的包? 您可以使用http://blog.csdn.net/powerccna/article/details/37739207 这里的实现的函数&#xff0c;扫描指定文件夹下的jar包&#…

linux ubantu扩展空间,ubuntu 扩展存储空间

今天解决了一个Ubuntu存储空间不足的问题。我在网上查了很多资料&#xff0c;都没有什么让我满意的方法。我是菜鸟级的用户&#xff0c;当然使用最菜的方法。以下是我的解决方案&#xff0c;供大家参考。方法步骤&#xff1a;第一步&#xff0c;在Ubuntu系统下&#xff0c;进入…

从使用到原理学习Java线程池

来源&#xff1a;SilenceDut http://www.codeceo.com/article/java-threadpool-learn.html线程池的技术背景 在面向对象编程中&#xff0c;创建和销毁对象是很费时间的&#xff0c;因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此&#xff0c;虚拟机将试图跟…