使用名字空间成员的简单方法:

  using namespace ::name;例如:using std::cin;

  头文件不应包含using声明

标准库类型string:(需要带有头文件#include<string>)

  string对象的初始化方式

    string s1;(默认空字符串)

    string s2=s1;

    string s3="asfg";(拷贝初始化)(也可:string s3("asfg");直接初始化)

    string s4(10,'x');(s4=="xxxxxxxxxx")

  string的操作

    os<<s 将s写入输出流os中并返回os

    is>>s 将is中字符串赋给s并返回is

    getline(is,s)从is中读取一行赋给s并返回is

    s.empty() 返回s是否为空

    s.size() 返回s中字符个数

    s[n] 返回s中下标为n的字符的引用,原理同数组

    >,<,==,<=,>= 比较两字符串的“大小”,按字典顺序

  使用cin,cout可以直接读写s对象,从第一个字符读起到第一个空白(即只能读取一个“单词”),如果希望完整读取:

    string str;

    while(cin>>str){

      /*********/}

    或者使用getline读取一整行(换行符未存进字符串对象):

    string str;  

    while(getline(cin,str)){

      /*********/}

  注意:str.size()返回值类型为string::size_type类型,通过auto可以获取字符串长度:

    auto len=str.size();

  第一个相异字符决定两字符串"大小",若两字符串仅长度不一,则长的“大于”短的

  注意:字符串字面值之间不可直接相加,‘+’两端至少有一项是string对象

cctype头文件中的字符处理函数

  char s;

  isalnum(s);  s是字母或数字为真

  isalpha(s);   s是字母时为真

  iscntrl(s);     s是控制字符是为真

  isdigit(s);   s是数字时为真

  isgraph(s);   s不是空格但是可以打印时为真

  islower(s);    s是小写字母时为真

  isprint(s);   s是可打印字符时为真

  ispunct(s);    s是标点符号时为真

  isspace(s);   s是空白时为真

  isupper(s);   s是大写字母时为真

  isxdigit(s);    s是十六进制数字时为真

  tolower(s);    输出小写字母

  toupper(s);   输出大写字母

范围for语句:(c++11)

  类似Java的foreach语句,格式为: for(declarion:expression),其中expression是一组序列

  std::string str("Hello World");

  for(auto &c:str){(使用引用类型改变了string的值)

    c=toupper(c);
    std::cout<<c;}(c对应的就是序列中的元素)

标准库类型vector

  格式:vector<int>ivec;

     vector<vector<int>>ivec_2d;(二维,c++11)

     vector<vector<int> >ivec_2d;(二维,旧c++标准)

  初始化格式:vector<T> v1;(空)

        vector<T> v2(v1);(v2含v1的所有元素的副本,等价于vector<T>v2=v1;)

        vector<T> v3(n,val);(与string类似,包含n个相同的元素)

        vector<T> v4(n);(包含n个元素,但仅默认初始化)

        vector<T> v5{a,b,c,.....};(直接初始化,等价于vector<T> v5={a,b,c,.....};)

        对于列表初始化,按向量类型进行区分:

          vector<string> vecstr1{10};(vecstr1有十个默认初始化的元素)

          vector<string> vecstr2{10,"strings"}(vecstr2有十个元素"strings")

          vector<string> vecstr3{"Mother","Fucker"};(vecstr3有两个元素”Mother“,”Fucker“)

  添加元素:vector<int> v5;v5.push_back(i);(将元素i压入向量尾部)

       注意:范围for语句的循环体内部不能包含向vector对象添加元素的语句(范围for语句的遍历序列大小应是固定的)

  vector操作:v.empty();(判断是否为空)

       v.size();(元素个数,返回类型vector<T>::size_type)

       v.push_back(i);

       v[n];

       <,>,<=,>=,==,!=(按字典顺序比较)

  vector的下标只能访问元素而不能添加元素

迭代器iterator

  auto b=v.begin();b表示v的第一个元素  auto e=v.end();e表示v的尾元素的下一位置

  其中若v为空,v.begin()和v.end()均表示v的尾后元素

  迭代器操作:*iter  返回所指元素的引用

        iter->mem (等价于(*iter).mem)获取成员mem

        ++iter  指向容器后一个元素

        --iter  指向容器前一个元素

        ==,!=  判断相等与否

  迭代器类型:iterator(能读写)和const_iterator(只读不写)

  (c++11)v.cbegin();和v.cend();返回类型均为const_iterator,无关对象本身是否为常量

  任何改变容器对象容量的操作(比如push_back)均使迭代器失效

  迭代器运算:iter+n  向后n个元素

        iter-n  向前n个元素

        iter+=n  向后并赋值

        iter-=n  向前并赋值

        iter1-iter2  两个迭代器之间的距离(类型是difference_type带符号整数,两个迭代器必须指向同一容器中的元素)

        >,<,<=,>=  位置在前则小,在后则大

数组

  数组的大小是固定的,也即其个数必须是常量const

  例如:constexpr int sz=42;

     string strArray[sz];

  char a1[ ]={'H','e','l','l','o','\0'}等效于char a1[ ]="Hello";

  禁止用数组来赋值另一数组

  几组易混淆的概念:

  例如:int *prts[10];(含有10个整型指针的数组)

     int (*Parray)[10]=&arr;(Parray指向一个含有10个整数的数组)

     int (&arrPref)[10]=arr;(arrPref是一个含有10个整数的数组的引用)

     int *(&arry)[10]=arr;(arry是一个含有10个整型指针的数组的引用)

  数组下标的类型是size_t,两指针相减的类型是ptrdiff_t类型 auto n=end(arr)-begin(arr)得到arr元素数量

  编译器自动将数组名替换为指向数组首元素的指针,使用decltype仍视其为数组

  数组的begin和end函数:(c++11)(#include<iterator>)

    int *beg=begin(arr);(获取指向arr首元素的指针)

    int *last=end(arr);(获取指向arr尾后元素的指针,避免因使用auto *e=&arr[10];不当而出错)

C风格字符串:(除非题目有一些奇怪的要求,尽量还是避免使用)

  string函数:(应用类型为char[ ]即字符数组,要求str以空字符'\0'结尾)

    strlen(str);返回str的长度并且不计空字符

    strcmp(str1,str2);比较两字符串“大小”,=:0,    >:正值,<:负值 

    strcat(p1,p2);p1后面附加p2并且返回p1

    strcpy(p1,p2);将p2拷贝给p1并且返回p1  

允许字符数组和string进行混用,存在部分限制:

  禁止用string初始化char[ ],反之允许(借助c_str()函数:const char *str=s.c_str();)

允许数组初始化vector:

  例如:int int_arr[ ]={1,2,3,4,5};

     vector<int>ivec(begin(int_arr),end(int_arr));(提供数组的首元素地址和尾后元素地址即可)

     vector<int>ivec(int_arr+1,int_arr+3);(也可以仅用数组的一部分进行初始化)

多维数组:

  初始化方式:

    例如:int ia[3][4]={{1},{2},{3}};(初始化每行的首元素)int ia[3][4]={1,2,3,4};(仅初始化第一行)

  引用:

    例如:int(&row)[4]=ia[1];(row引用ia的第二行4元素数组)

  范围for遍历:

    例如:for(const auto &row:ia){//外层必须用引用类型遍历

        for(auto col:row){//只有最内层可以不用引用类型

          /*..........*/}

C++Primer 5th Chap3 Strings,Vectors, and Arrays的更多相关文章

  1. C++Primer 5th 练习 12.19

    这阵子真是太忙了, 连续做了四个课设. 当然这并不能作为好久没写博客的借口, 没写博客的主要原因只有一个: 懒. 最近又开始回顾C++的语法与特性(据说C++就是一门需要反复回顾的语言),以及学习C+ ...

  2. 【读书笔记】C++ primer 5th 从入门到自闭(一)

    这几天看了C++ primer 5th的一二章,有很多收获,但是有的地方因为翻译的问题也搞得理解起来颇为难受啊啊啊啊.尤其是const限定符,在C语言并没有这么多复杂的语法,在C++里面语法细节就多的 ...

  3. C++ Primer 5th 第5章 语句

    和大多数语言一样,C++提供了条件执行语句.重复执行相同代码的循环语句和由于中断当前控制流的跳转语句,表达式语句和声明语句等. 语句有简单语句和复合语句之分.简单语句但多数以分号结束,最简单的语句就是 ...

  4. C++ Primer 5th 第3章 字符串、向量和数组

    *****代码在Debian g++ 5.40 / clang++ 3.8(C++11)下编写调试***** 本章主要是关于字符串.数组的内容,以及一些简单的容器知识. 1.using的声明 usin ...

  5. C++ Primer 5th 第1章 开始

    *****代码在Ubuntu g++ 5.31 / clang++ 3.8(C++11)下编写调试***** 每个C++程序必须有一个main( )函数,main( )函数的返回值也必须是int类型, ...

  6. c++ primer 5th 练习3.43

    #include <iostream> using namespace std; int main() { ][]={,,,,,,,,,,,}; /* for(int (&i)[4 ...

  7. C++ Primer 5th 第16章 模板与泛型编程

    模板是C++中泛型编程的基础,一个模板就是创建一个类或者函数的蓝图或者说公式. C++模板分为函数模板和类模板. 类模板则可以是整个类是个模板,类的某个成员函数是个模板,以及类本身和成员函数分别是不同 ...

  8. C++ Primer 5th 第15章 面向对象程序设计

    面向对象程序设计的核心思想是:数据抽象.继承和动态绑定. 数据抽象:将类的接口与实现分离: 继承:定义相似类型并对相似关系建模: 动态绑定:一定程度上上忽略相似类型间的区别,用同一方式使用它们. 1. ...

  9. C++ Primer 5th 第13章 拷贝控制

    当一个对象的引用或者指针离开作用域时,析构函数不会执行. 构造函数有初始化部分(初始化列表)和函数体. 析构函数有析构部分和函数,但析构函数的析构部分是隐式的.

随机推荐

  1. Spring Cloud Gateway(十):网关过滤器工厂 GatewayFilterFactory

    本文基于 spring cloud gateway 2.0.1 1.GatewayFilterFactory 简介 路由过滤器允许以某种方式修改传入的HTTP请求或传出的HTTP响应. 路径过滤器的范 ...

  2. cmake入门之内部构建

    https://www.cnblogs.com/coderfenghc/tag/cmake/ https://cmake.org/cmake/help/v3.16/guide/tutorial/ind ...

  3. CSS子选择器与后代选择器的区别

    p > span{ color:blue; } <p> 嵌套使用<span>css好牛逼!</span><span>是啊<b>也影响孙 ...

  4. 20175313 张黎仙《获奖感想与Java阶段性学习总结》

    一.获奖感想 很荣幸能够成为为数不多的小黄衫获得者之一,这是对我近一学期以来学习成果的肯定,也激励着我更加努力学习. 首先我要感谢的人就是娄嘉鹏老师.我曾在师生关系中提到,我认为的好老师的特点之一是: ...

  5. oracle之case

    使用oracle时,不免会用到判断后转换为要展示的值,这里常用case,如下: SELECT (case ) then 'yes' ) then 'no' else 'other' end) --no ...

  6. Postgresql修改字段的长度

    alter table tbl_exam alter column question type character varing(1000); alter table tbl_exam alter c ...

  7. Go -- this user requires mysql native password authentication 错误

    this user requires mysql native password authentication 在连接mysql的url上加上?allowNativePasswords=true,这次 ...

  8. 【DOS】取某目录下某类型文件信息放入文本

    C:\Users\horn1\Desktop\新建文件夹>dir *.jar >1.txt 这样,所有扩展名为jar的文件信息就送到新建的文本文件1.txt中了.虽然简单,但也是个常用功能 ...

  9. Strin类

    常见构造方法 • public String():空构造 • public String(byte[] bytes):把字节数组转成字符串 • public String(byte[] bytes,i ...

  10. 关于define('DISCUZ_ROOT', substr(dirname(__FILE__), 0, -7));的理解

    关于define('DISCUZ_ROOT', substr(dirname(__FILE__), 0, -7));的理解 define('DISCUZ_ROOT',  substr(dirname( ...