string、vector等容器、迭代器要点

只记录要点。

文章目录

    • string
        • 初始化string
        • string类的成员函数
        • string读取
        • getline读取一整行
      • C标准库String函数
        • line.size();line.empty();
        • string::size_type类型、decltype
        • string的索引
          • 1下标运算符`[]`,
          • 2迭代器
    • 标准库vector
      • 初始化vector对象
      • vector操作
    • 迭代器
        • 迭代器的类型
        • 迭代器的操作

string

头文件:#include using std::string;
严格来说,string对象不属于容器类型,但是string支持很多与容器类似的操作。

初始化string

string s1
string s2(s1)
string s2=s1
string s3("hello")
string s3="value"
string s4(n,'c') n个字符c组成的串
#### 对单个字符的处理

cctype头文件中的函数

#include == #include"ctype.h"
isalnum(c)  c是字母或数字
iscntrl(c)
isdigit(c)
isgraph(c)
ispunct(c)  是标点符号(即c不是控制字符,数字字母,可打印空白中的一种)
isxdigit(c) 十六进制
islower(c) 是小写
isupper(c)
tolower(c) 改小写
toupper(c)

不同在于等号的实际上执行的是拷贝初始化,不使用等号的是直接初始化。

string类的成员函数

os<>s
getline(is,s) 从is中读取一行赋给s,返回is
s.empty()
s.zie()
s[n]
s1+s2//使用加号的两侧必须至少有一个是string
s1=s2
s1==s2 
!= >= <=

string读取

int main(){
	string s1,s2;
	cin>>s1,s2;
	cout<

在读取时,string对象会自动忽略开头的空白(空格,换行符,制表符),从第一个真正的字符开始读起,直到遇到下一处空白为止。

getline读取一整行

getline可以保留输入时的空白符。getline的参数是一个输入流和一个string对象。直到遇到换行符为止(换行符也被读进来了)。getline返回它的流参数。
string line;getline(cin,line);

C标准库String函数

在cstring头文件中,cstring是C语义头文件string.h的C++版本。

传入此类函数的指针必须指向以空字符作为结束的数组。
#include
strlen(p);
strcmp(p1,p2);
strcat(p1,p2);追尾,返回p1
strcpy(p1,p2);
string专门提供了一个名为c_str的成员函数,返回的是一个C风格的字符串。函数的返回结果是一个指针,该指针指向一个空字符结束的字符数组。
string s("hello world");
char *str=s;//错误,不能用string对象初始化char*
const char *str=s.c_str();

line.size();line.empty();

string::size_type类型、decltype

size函数其实返回的是一个string::size类型的值。
string类及其他大多数标准库类型都定义了几种配套的类型。这些配套类型图像了标准库与机器无关的特性,类型size_type即是其中的一种。
string::size_type是无符号类型的值。所有用于存放string类的size函数返回值的变量,都应该是str//:size_type类型的。
C++11允许通过auto或者decltype来推断变量的类型
auto len=line.size();
如果一个表达式中已经有了size函数,就不要再使用int了。
经过使用for(auto c:str) c=toupper(c);来对string中的单个字符进行处理。
可以使用关键字decltype来检测某个值的类型

string的索引

访问string对象的单个字符的两种方式:下标和迭代器

1下标运算符[]

接收的是string::size_type类型的值。s[s.size()-1]是最后一个字符
只要字符串不是常量,就能为下标运算符返回的字符赋新值。

2迭代器

标准库vector

头文件#include using std::vector
vector是一个类模板,是模板而非类型。所以使用vector时,需要指出编译器应把类或函数实例化成何种类型。编译器根据模板创建类或函数的过程称为实例化instantiation。

初始化vector对象

vector v1;
vector v2(v1);
vector v2=v1;
vector v3(n,val);
vector v4(n);
vector v5{a,b,c}
vector v5={a,b,c}

通常情况下,可以只提供vector对象容纳的元素数量而不用略去初始值。此时库会创建一个值初始化的元素初值。
必须使用直接初始化的形式指定向量大小
vector vi=10;错误,必须使用直接初始化的形式指定向量大小
列表初始值还是元素数量的真实含义依赖于传递初始值时用的是花括号还是圆括号。

vector操作

s.begin()和s.end()函数经常用作迭代器的初末值

迭代器

迭代器的运算符

*ter 引用
iter->mem
++iter
--iter
== !=

迭代器的类型

类似vector::iterator it; string::iterator it2
下面两个是只能读元素,不能写元素的迭代器
vector::const_iterator it; string::const_iterator it2

迭代器的操作

v.push_back(i);
v.empty()
(*it).empty()
it->empty()
v.size()
v[n]  只能返回值,不能修改
v1=v2
v1-{a,b,c}
== >= <= !=
v.begin() v.end()
v.cbegin() v.cend()

iter+n
iter-n
iter1 - iter2
距离的类型为difference_type带符号整型
auto mid = vi.begin() + vi.size()/2
auto mid = vi.begin() + (end-begin)/2

string和vector的元素保存在连续的内存空间中,所以随机访问很快。但是中间添加和删除元素很耗时。而且,添加一个元素有时可能还需要分配额外的存储空间,在这种情况下,每个元素都必须移动到新的存储空间中。

list和forward_list的目的都是令容器任何位置的添加和删除操作都快。作为代价,这两个容器不支持随机访问。

deque支持随机访问,在中间添加删除元素代价很高。但是两端添加和删除元素很快。

容器操作
iterator 此容器类型的迭代器类型
const_iterator 可以读取元素,但不能修改元素的迭代器类型
size_type 无符号整型,足够报错此种容器类型最大可能容器的大小
difference_type 带符号整型类型
value_type 元素类型
reference 元素的左值类型,与value_type&含义相同
const_reference 元素的const左值类型
构造函数:
C c;
C c1(c2);
C c(b,e); 将迭代器b和e指定的范围内的元素拷贝到c

C c{a,b,c}  列表初始化
赋值和swap
c1=c2
c1={a,b,c}
a.swap(b) 交互ab的元素
大小c.size()
c.max_size()
c.exmpy() 是否为空
添加\删除元素
c.insert(args)
c.emplace(inits) 使用inits构造c中的一个元素
c.erase(args) 删除args指定的元素
c.clear()  删除所有元素
关系运算符
== !=  > >= < <=
获取迭代器
c.begin()   c.end() 返回首元素和尾后元素
c.cbegin()  c.cend() 返回const_iterator
反向容器的额外成员(不支持forward_list)
reverse_iterator 按逆序寻址元素的迭代器
const_reverse_iterator 不能修改元素的逆序迭代器
c.rgegin()  c.rend() 指向尾元素和首元素之间位置的迭代器
c.crbegin() c.crend() 返回const_reverse_iterator

迭代器范围

一个迭代器范围由一对迭代器表示,分别指向首和尾后元素。即begin和end。第二个迭代器从来都不会指向范围中的最后一个元素。左闭右开

如果begin和end相等,则范围为空

你可能感兴趣的:(C++)