c++ primer第三章 - 字符串、向量、数组

字符串、向量、数组:

using std::cin; 

标准库类型:string vector

1 string

            #include <string>

string s4(10,'c');  //自己初始化

1.1 string的相关操作

拷贝初始化 "="、直接初始化 "()":

string s1="sdhf";  //拷贝初始化

string s1(“sdrf”);  //直接初始化

c++ primer第三章 - 字符串、向量、数组


getline(cin,line);函数,一次读取一行,遇到回车返回;

string的“+”运算要求 “+” 两边至少有一个是string类型;


c++ primer第三章 - 字符串、向量、数组

alphabet: 字母

punctuation:标点符号

头文件:c标准(name.c)  C++标准(cname)


1.2 访问string中的每一个字符:

        c++ primer第三章 - 字符串、向量、数组

   c++ primer第三章 - 字符串、向量、数组

如果想要改变string对象中的字符的值,一定要把循环变量定义为应用变量:

如 将s中的小写变大写:

  for(auto &c:s)

          c=toupper(c);

1.3 访问string中的部分字符

方法一:使用下标;
方法二:使用迭代器;
s[0];

2 vector

#include <vector>
vector<int>
vector<Sales_item>
vector<vector<string>>

2.1 vector 初始化


c++ primer第三章 - 字符串、向量、数组

c++ primer第三章 - 字符串、向量、数组

2.2 vector操作

v2.push_back(i);

c++ primer第三章 - 字符串、向量、数组


2.3 vector 访问元素

c++ primer第三章 - 字符串、向量、数组

3 迭代器

             迭代器是一种类型,用于访问容器中的元素或者在元素之间移动;
             尾后迭代器:end函数返回的迭代器;

3.1 迭代器零碎知识

v.begin();  //
v.end();   //end成员负责返回指向容器“尾元素的下一个位置”的迭代器;
c++ primer第三章 - 字符串、向量、数组
c++ primer第三章 - 字符串、向量、数组
c++ primer第三章 - 字符串、向量、数组

it->mem  ;  (*it).mem; 意思相同

c++ primer第三章 - 字符串、向量、数组

.cbegin()   ;   .cend();    是c++11 新定义的返回 vector<int>::const_interator;

3.2迭代器运算



c++ primer第三章 - 字符串、向量、数组

vi.begin():指的是: vi[0];  
vi.begin()+n:指的是: vi[n];


4 数组

4.1 不能用一个数组初始化另一个数组;

c++ primer第三章 - 字符串、向量、数组

4.2  数组指针



c++ primer第三章 - 字符串、向量、数组
类型修饰符从右向左依次绑定;

int *(&arry)[10]=ptrs;  //arry是数组的引用,该数组含有10个指针;
c++ primer第三章 - 字符串、向量、数组

4.3 访问所有元素

4.3.1 范围for循环

c++ primer第三章 - 字符串、向量、数组



4.3.2 指针的begin(p);  end(p);

c++ primer第三章 - 字符串、向量、数组

c++ primer第三章 - 字符串、向量、数组

4.4 使用数组初始化vector对象:

int int_att[]={0,1,2,3,4,5};
vector<int> ivec(begin(int_att),end(int_att));

c++ primer第三章 - 字符串、向量、数组

5 多维数组:

c++中没有多维数组,多维数组其实是数组的数组;
范围for语句的非最内层循环都用引用,因为指针不支持循环访问:

5.1 for(auto &row:ia)

     for(auto &col:row)
             。。。
c++ primer第三章 - 字符串、向量、数组


5.2 指针访问:

c++ primer第三章 - 字符串、向量、数组


5.3 begin(ia);end(ia)访问:





c++ primer第三章 - 字符串、向量、数组
实测:int (*p)[4];  其实是指针的指针,所以 auto q=begin(*p);

6 总结:

访问string、vector、数组 最好使用范围for循环 或者 begin()、end(),因为不涉及数组大小,方便移植:
string:
for(auto &p:arr)
    for(auto &q:p)
          ...
for(auto i=begin(att);i!=end(att);i++)

vector:
for(auto &p;arr)
   for(auto &q:p)
      ...

数组:
for(auto i:att)
    cout<<i;

多维数组:

for(size_t i=0;i!=rowCnt;++i)
    for(size_t j=0;j != colCnt; ++j )
            ia[i][j]=i*colCnt + j;

size_t cnt=0;
for(auto &row : ia)
    for(auto &col : row )
       {
          col=cnt;
          ++cnt;
       }

for(auto p=ia; p != ia+3;  ++p)
     for(auto q = *p;q != *p+4; ++q
           ....


for (auto p=begin(ia);p!=end(ia);++p)
     for(auto q=begin(*p);q!=end(*p);++q)
           ...