C++primer第3章笔记

翻了翻之前看的,好像又忘了,还是敲一遍加深印象把,以后放在这里也便于自己查找

目录

    • 1.标准库类型string
    • 2.标准库类型vector
    • 3.迭代器
    • 4.数组
    • 5.primer习题集
      • 3.5
      • 3.10

1.标准库类型string

命名空间

using namespace::std;

标准库类型string
包含头文件

#include 

初始化string对象的方式

    string s1;              //初始化为空字符串 
    string s2("hello");     //初始化为一个字符串字面副本 
    string s3(s2);          //将s3初始化为一个s2的副本 
    string s4="hi jiajia";  //初始化为一个字符串字面副本 
    string s5(n,'C');       //把s5初始化为由连续n个字符C组成的串

string对象上的操作

string s;
os<<s        //将s写到输出流os当中,返会os
is>>s        //从is中读取字符串赋给s,字符串以空白分隔,返回is
s.empty();   // s为空串 返回true
s.size();    // 返回s中字符个数 类型应为:string::size_type
s[n];        // 从0开始相当于下标访问
s1+s2;       // 把s1和s2连接成新串返回新串 
s1=s2;       // 把s1替换为s2的副本
v1==v2;      // 比较,相等返回true
!=, <, <=, >, >=`  惯有操作 任何一个大写字母都小于任意的小写字母

使用getline读取一整行

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

当字面值和string对象相加时必须确保每个加法运算符的两侧的运算对象至少有一个时string
cctype头文件中的函数

isalnum() //如果参数是字母数字,即字母或数字,该函数返回true
isalpha() //如果参数是字母,该函数返回true
isblank() //如果参数是空格或水平制表符,该函数返回true
iscntrl() //如果参数是控制字符,该函数返回true
isdigit() //如果参数是数字(0~9),该函数返回true
isgraph() //如果参数是除空格之外的打印字符,该函数返回true
islower() //如果参数是小写字母,该函数返回true
isprint() //如果参数是打印字符(包括空格),该函数返回true
ispunct() //如果参数是标点符号,该函数返回true
isspace() //如果参数是标准空白字符,如空格、进纸、换行符、回车、水平制表符或者垂直制表符,该函数返回true
isupper() //如果参数是大写字母,该函数返回true
isxdigit() //如果参数是十六进制的数字,即0~9、a~f、A~F,该函数返回true
tolower() //如果参数是大写字符,则返回其小写,否则返回该参数
toupper() //如果参数是小写字母,则返回其大写,否则返回该参数
tolower()——toupper() 大写转为小写——小写转为大写
isupper()——islower() 判断是否为大写——判断是否为小写,若是返回true,否则返回该参数
isalnum()——isalpha() 判断是否为字母或数字,若是返回true,否则返回该参数——判断是否为字母,若是大写字母返回1,若是小写字母返回2,若不是字母返回0

范围for语句

string str("some string");
for(auto c:str)
    cout<<c<<endl;

如果只是想要对string部分元素进行访问,可以使用下标运算,或者迭代器

2.标准库类型vector

头文件

#include

vector是一个类模板,模板本身不是类也不是函数,当使用模板时,需要指出编译器应该把类或函数实例化成何种类型。我们通过提供额外信息指定模板实例化成什么样的类,提供信息的方式总是:在模板后面加一对尖括号,在括号内放上信息。

vector<int> ivec;
vector<Sales_item> Sales_vec;
vector<vector<string>> file;

初始化vector的方式
vector 的六种 创建和初始化方法
如果用的是圆括号,可以说提供的值是用来构造vector对象的
如果用的是花括号,可以表述成我们想列表初始化
例如:

vector<int> v1(10);   //v1有10个元素,每个的值都是0
vector<int> v2{
     10};   //v2有1个元素,该元素的值是10
vector<string> v5{
     "hi"};  //列表初始化:v5有一个元素
vector<string> v6("hi");  //错误:不能使用字符串字面值构建vector对象

当我们开始不知道vector对象中所需元素的个数,我们可以先创建一个空的vector,然后运行时利用vector的成员函数push_back向其添加元素
使用时注意的问题,初始化容器的数量已知,pusn_back没有将数据压入堆栈,参考例子:
c++中vector初始化问题,push_back

#include
#include
#include
using namespace std;
int main()
{
     
    vector<int> v1;
    int i;
    for (i=0; i != 100; i++)
    {
     
        v1.push_back(i);
    }
    cout << v1[0] << endl;
    return 0;
}                     //把从0到99的数依次填入

如果循环体中包含有向vector对象添加元素的语句,则不能使用范围for循环,不能用下标的形式添加元素 ,只能对确知已经存在的元素执行下标访问。

v.empty()              //如果容器v不含有元素,返回真,否则返回假
v.size()               //返回v中元素的个数
v.push_back(elem)      //往v的尾端添加元素elem
v.pop_back()           //移除最后一个元素
v.begin()              // 返回指向第一个元素的迭代器
v.end()                //返回指向容器的“尾元素的下一位置”的迭代器,它指向一个不存在的尾后元素。
v.insert(pos,elem)     // 在pos位置前插入一个元素elem,返回新数据位置。
v.insert(pos,n,elem)   // 在pos位置前插入n个elem数据,无返回值。
v.insert(pos,beg,end)  // 在pos位置插入在[beg,end)区间的数据。无返回值。
v.erase(pos)           // 删除pos位置的数据,返回下一个数据的位置。
v.erase(beg,end)       //删除[beg,end)区间的数据,返回下一个数据的位置。
v.clear()              // 移除容器中所有数据。
v[n]                   //返回v中n个位置上元素的引用
v1=v2                  //用v2的元素拷贝替换v1的元素
v1={
     a,b,c...}          //用列表中的元素拷贝替换v1中的元素

参考vector容器支持的一些操作
vector使用时的注意问题:
vector的一些使用注意项,清空和容量初始化

3.迭代器

除了下标访问string对象和vector对象,还可以使用迭代器,传回来的是指针

运算符 作用
*iter 返回迭代器iter所指元素的引用
iter -> mem 解引用iter,并获取元素名为mem的成员
++iter 令iter指示容器的下一个元素
–iter 令iter指示容器的上一个元素
iter1 == iter2 判断两个迭代器是否相等(不相等),如果两个迭代器指示的是同一个元素
iter1 != iter2 或者它们是同一个容器的尾后迭代器,则相等;反之,不相等

在for循环中,使用迭代器习惯用!=,印尼为大多数标准容器库并没有定义<,但他们都定义了==和!=

vector<int>::iterator it;//it能读写vector的元素
vector<int>::iterator it3;//it3只能读元素,不能写元素

注意:使用了迭代器的循环体,都不要向迭代器所属的容器添加元素

4.数组

string nums[]={
     "one","two","three"}; //数组的元素是string对象
string *p=&nums[0];                         //p指向nums的第一个元素
string *p2=nums;                             //等价于p2=&nums[0],编译器自动将数组名替换成指向数组的首元素的指针

指针就相当于数组的迭代器,标准库函数begin和end
因为数组不是类类型,所以访问这两个函数不能以成员函数的形式

int ia[]={
     0,1,2,3,4,5,6,7,8,9};
int *beg=begin(ia);
int *last=end(ia);//指向ia尾元素的下一个位置的指针

这两个函数定义在iterator头文件中

5.primer习题集

3.5

#include
#include
using namespace std;
int main()
{
     
    string result;
    string a1;
    while (cin >> a1)
    {
     
        for (int i = 0; i < a1.length(); i++)
        {
     
            a1[i] = toupper(a1[i]);
      }
        if (!result.size())
        {
     
            result = result + a1;
        }
        else
            result = result + " "+a1;
       
    }
    cout << result << endl;
    return 0;
}

范围for形式
(使用范围for,要改变元素的值可以使用引用,要输出元素的值可以直接赋值相等)

#include
#include
using namespace std;
int main()
{
     
    string result;
    string a1;
    while (cin >> a1)
    {
     
        for (auto &a :a1)
        {
     
            a = toupper(a);
        }
        if (!result.size())
        {
     
            result = result + a1;
        }
        else
            result = result + " "+a1;
       
    }
    cout << result << endl;
    return 0;
}

迭代器形式

#include
#include
using namespace std;
int main()
{
     
    string result;
    string a1;
    while (cin >> a1)
    {
     
        for (auto it=a1.begin();it!=a1.end()&&!isspace(*it);++it)
        {
     
            *it = toupper(*it);
        }

        if (!result.size())
        {
     
            result = result + a1;
        }
        else
            result = result + " "+a1;
       
    }
    cout << result << endl;
    return 0;
}

3.10

除去字符串中的标点符号这种类型的是把要保留的作为一个字符串输出出去

#include
#include
using namespace std;
int main()
{
     
  
    string a1;
    cin >> a1;
    for(auto &a:a1)
    {
     
        if (!ispunct(a))
        {
     
            cout << a;
    }
    }
    return 0;
}

你可能感兴趣的:(C++学习笔记)