C++学习日记——字符串、向量和数组

1、using声明:使用命名空间。一般头文件中不应包含using声明。

using std::cin;
using std::cout;
using namespace std;

2、标准库类型string:表示可变长度的字符序列,需要包含string头文件,string定义在命名空间std中。

#include <string>
using std::string;

  A、定义和初始化string对象

    a、直接初始化(不用=) 

string  s1("Hello,World!");
string  s2(10,'c');  //s2的内容是10个c

    b、拷贝初始化(使用=)

string s3 = "Hello,World!";
string s4 = s3;

  B、string对象支持的操作

    a、输入输出流

string s;
cin>>s; //注意输入流会忽略开头的空白,直接读入第一个有效字符,当遇到下一个空白时停止。即输入"Hello World!",下面输出流输出的是Hello
cout<<s<<endl;
//读取未知数量的string对象
string word;
while(cin>>word) //遇到结束标记C+Z结束读取
  cout<<word<<endl;

    b、getline(cin,string)读取带空白的字符串,遇到换行符结束读取。getline实际上读入了换行符,但是在存入string对象时丢掉换行符。

string line;
while(getline(cin,line))
    cout<<line<<endl;

    c、s.empty()和s.size()。若字符串为空,则s.empty()返回true,否则返回false。s.size()返回字符串的长度。

auto len = s.size();

     注意len的类型是string::size_type。最好不要将s.size()与有符号类型进行运算,因为s.size()是无符号整型,有符号数在运算时负数会自动转换为大的无符号值。

    d、s[n]返回s中第n个字符的引用,n从0开始。

    e、字符串比较。==、!=、<、<=、>、>=

      按字典顺序比较,如果较短string对象与较长string对象的前半部分完全相同,则较短string<较长string

    f、赋值。s1 = s2.

    g、相加。两个string类型对象相加即是将字符串连接起来,string类型可以与字面值类型相加,但字面值类型之间不可相加。字符串字面值如“Hello”不是string类型。

string s1 = "Hello";
string s2 = "World!";
string s3 = s1+s2;  //s3 = "HelloWorld!"

string s4 = s1 + "World!";  //合法
string s5 = "Hello" + "World!";  //不合法
string s6 = s1 + "World" + "!"; //合法
string 27 = "World"  + "!" + s1;  //不合法

3、标准库类型vector

声明:

#include <vector>  //头文件
using namespace std;  //命名空间

vector表示对象的集合,其中的所有对象的类型相同,每一个对象都有一个对应的索引,索引用于访问对象。vector容纳着其他对象,因此vector被称为容器。理解:把vector理解为瓶子,瓶子的数目是任意的,但是每一个瓶子中只能存放同一类东西。vector可以存放int类型的对象,也可以存放string类型的对象,还可以存放其他vector类型的对象。

  A、定义和初始化vector对象

    刚打完就失手删掉了……

  B、向vector对象中添加元素:push_back();

  C、vector对象支持的操作

    类似于string。  

4、迭代器

可以使用迭代器来访问容器中的对象。C++中,除了string和vector容器,还有许多其它容器,所有容器都支持迭代器的访问,但只有少数容器支持下标访问,string和vector容器就支持下标访问。

  A、迭代器的获取

vector<int>  v = {...};  //假设v已经过初始化
auto b = v.begin();
auto e = v.end();

    begin和end是各种容器类型中的成员,其中begin返回指向容器中第一个元素的迭代器,而end返回指向容器中"最后一个元素的下一个位置的迭代器",所以end所指向的位置是没有实际含义的,仅仅是一个标记。end成员返回的迭代器称为尾后迭代器。对于空容器,begin和end返回的是同一个迭代器。

  B、迭代器支持的运算

    *iter:返回迭代所指向的元素的引用。可以理解为迭代器iter指向一个元素,*iter等价于这个元素的别名。

    iter->mem:访问iter指向元素的成员,等价于(*iter).mem。

    ++iter、--iter:指向下一个或上一个元素

    ==、!=:判断两个迭代器相等或不等,条件是两个迭代器指向同一个元素或是同一个容器的尾后迭代器。

  C、迭代器参与的循环一般使用!=和==作为判断条件,因为有许多容器的迭代器类型没有定义<、>等运算。

  D、迭代器的类型是iterator和const_iterator:const表示迭代器只能读自己指向的元素,而不能写这个元素。

    一般情况下,如果对象用const修饰了,那么begin和end返回的类型就是const_iterator。否则就是iterator。如果对象是只读的,可以使用cbegin和cend返回。

  E、凡是使用了迭代器的循环体,都不要向迭代器所属的容器添加元素。

  F、string和vector额外支持的迭代器运算: 

     iter + n、iter - n、+=、-=、iter1 - iter2、>、<、>=、<=

     其中iter1 - iter2要求两个迭代器指向同一个容器的元素,相减得到的值的类型是difference_type,这个类型是带符号类型,可正可负

  G、二分搜索

5、数组

数组也是存放相同类型对象的容器。只是数组的大小确定不变。

  A、数组的定义和初始化

     数组定义时维度必须是确定的,也就是说方括号内必须是常量表达式。数组定义不允许使用auto关键字,必须指定类型。

     

posted @ 2020-05-12 14:27  你的泪光  阅读(180)  评论(0)    收藏  举报