C++ primer笔记_unit3

本文详细介绍了C++中的字符串(string)、动态数组(vector)、迭代器(iterator)以及C风格字符串的使用方法,包括初始化、操作、迭代器运算和C++11的新特性。
摘要由CSDN通过智能技术生成

3.1using

using namespace std;
用以代替std::cin等等

3.2string

3.2.1string初始化

    string s1;              //默认初始化,空串
    string s2(s1);          //
    string s2 = s1;         //
    string s3("value");     //注意此处不会复制最后的\0
    string s3 = "value";    //
    string s4(n, 'c');      //

使用等号的,称之为拷贝初始化;否则称之为直接初始化

3.2.2string对象的操作

    is << s                 //s写入输入流,返回os;读取时自动无视前面的空格从真正的字符开始,直到遇见下一处空白
    os >> s                 //
    getline(is, s)          //获取一整行输入到is中,返回is
    s.empty()               //
    s.size()                //
    s[n]                    //
    s1 + s2                 //
    s1 = s2                 //
    s1 == s2                //
    <, >, <=, >=            //

读取未知数目的string:


    while(cin >> word)
        cout << word << endl;

使用getline:

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

对字符的处理:

    #include<cctype>
    isalnum(c);             //c为字母或数字
    isalpha(c);             //字母
    iscntrl(c);             //控制类型
    isdigit(c);             //数字
    isgraph(c);             //不是空格,但是可以打印
    isslower(c);            //小写字母
    issupper(c);            //大写字母
    isprint(c);             //c是可打印字符
    //等等

对字符的处理:

    string s("Hello");
    for (auto &c : s)
        c = toupper(c); //使用引用才能改变,类似函数调用
    cout << s << endl;

3.3vector

vector是模板而非对象
初始化:

    vector<int> vec1;                   //默认初始化
    vector<int> vec2(vec1);             //利用另一个vec初始化
    vector<int> vec3(n, val);           //创建指定数量相同元素
    vector<int> vec4(n);                //创建指定数量初始化元素
    vector<int> vec5{val1, val2, ...}   //列表初始化
    vector<int> vec6(begin(arr), end(arr))//C风格初始化   左闭右开
    //注意区分花括号和圆括号
    //花括号表示为列表初始化
    //圆括号表示为构造(construct)
    //如果花括号内值不能用来初始化,考虑是否是圆括号同等作用

添加元素:

    string word;
    vector<string> text;
    while(cin >> word){
        text.push_back(word);
    }

其余操作

    v.empty()
    v.size()
    v.resize(n)
    v.push_back(t)  
    t = v[n]
    v[n] = t                //仅当v[n]已经存在时

3.4iterator

运算操作:

    *iter
    iter -> mem
    ++iter
    --iter
    ==
    !=
    iter += n
    iter -= n
    iter1 - iter2
    >, <, >=, <=
    //迭代器相减结果为difference_type类型

简单示例:

    //字符串首个单词大写
    for (auto iter = vec.begin(); iter != vec.end() && !isspace(*iter); iter++)
        *iter = toupper(*iter);

const相关

    vector<int> v;
    const vector<int> cv;
    auto it1 = v.begin();   //iterator
    auto it2 = cv.begin();  //const_iterator
    auto it3 = v.cbegin();  //const_itrator

箭头运算符

    (*it).empty()
    iter -> empty()
    //等价

限制;
不能在范围for中向vector添加元素
push_back等改变vector容量的操作

3.5数组

不允许auto根据列表判断

不允许拷贝、赋值

常用size_t类型

3.5.1数组与指针

用到数组名字的地方,编译器自动替换为指向数组首元素的指针

对于auto和decltype的区别:

    //使用auto时,解析成指针
    int ia[] = {0, 1, 2};
    auto ia2(ia);
    //ia2为整形指针,指向ia数组的第一个元素

    //使用decltype时,解析为数组
    decltype(ia) ia3 = {1, 2, 3, 4};
    ia3[2] = 0;

指针也能作为迭代器

可以通过末尾的下一个下标获取尾后指针

C++11中数组同样含有begin和end,定义在iterator头文件中

指针相减为ptrdiff_t类型

内置的下标可以使用负数:

    int *p = &a[2];
    int t = p[-2];//a[0]

3.5.2C风格字符串

典型风格为末尾自动添加’\0’

标准库函数:

    #include<cstring>
    strlen(s);          //返回长度,不计末尾空字符
    strcmp(s1, s2);     //== ret 0; > ret 正 ...
    strcat(s1, s2);     //p2附加到p1后面
    strcpy(s1, s2);     //p2拷贝到p1上

3.6多维数组

与上一节类似

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值