zoukankan      html  css  js  c++  java
  • C++学习笔记

    1.范围for循环

    //将字符串s全变为大写
    for(char &i : s) {
        i = toupper(i);//字符处理函数<cctype>
    }

    范围for语句是C++11标准,用g++编译时,需要加上-std=c++11,不然会提示range-based ‘for’ loops are not allowed in C++98 mode
    范围for循环相对于传统for循环和while循环的优点是,我们无需关心循环边界条件,防止越界访问。

    2.字符串输入

    cin:忽略输入空白符

    string temp;
    while(cin >> temp){
        cout << temp <<endl;//temp中无换行符
    }

    用cin输入字符串,cin会忽略输入流中的空白(空格符、换行符、制表符等),将连续的字符提取出来。例如输入分隔开的”hello world!”,实际会进入两次while,temp先是”hello”,再是”world!”
    这里写图片描述

    getline():保留输入空白符

    string temp;
    while(getline(cin, temp){
        cout << temp <<endl;//temp中无换行符
    }

    用getline()输入字符串,可保留输入时的空白符。getline()在遇到换行符时会返回,返回时,不会将换行符保存到字符串中。
    这里写图片描述

    3.字符串、数组初始化

    字符数组初始化

    //错误,应该为char str[2] = "a";
    char str[1] = "a";
    
    //错误,字符数组未显式初始化
    char str[5];
    cout << str << endl;
    
    //错误,不允许拷贝初始化
    char a[] = b;

    用字符串字面值初始化字符数组。上述语句会编译报错error: initializer-string for array of chars is too long"a"是字符串,编译器会在字符串后面添加一个空字符串'',因此字符串字面值的实际长度要比它的内容多1,数组中包含.
    字符数组未显式初始化时,里面的内容是未定义的,我们不知道里面是什么内容。
    数组不允许拷贝初始化。

    字符串初始化

    //正确,str不包含
    string str = "a";
    
    //正确,string未显式初始化,默认初始化为空串
    string str;
    cout << str <<endl;
    
    //正确,string支持拷贝初始化
    string a = b;

    用字符串字面值初始化string对象。字符串字面值包含A,初始化时,除了最后的空子符外,其他的字符都被拷贝到新创建的string对象中,即string对象中不包含
    string对象未显式初始化时,执行默认初始化,str是一个空字符串。
    string对象支持拷贝初始化。

    4.C++新接口与C旧接口的转换

    //string --> char*
    const char *str = s.c_str();//str必须为const
    
    //char[] --> string
    char str = "a";
    string s = str;//对于string s = "a",我们可以将字符串字面值"a"替换为以空字符结尾的str
    
    //int[] --> vector<int>
    int arr[] = {0,1,2};
    vector<int> vec(begin(arr), end(arr));
    
    //vector<int> --> int[],for循环
    vector<int> vec{0,1,2};
    int arr[3];
    for(int *i = begin(arr); i != end(arr); i++)
        *i = vector[i-begin(arr)];

    1.迭代器end()指向尾元素的下一个元素,这样当begin!=end时,说明容器中还有内容。
    2.迭代器的判断用!=而不用<,是因为所有标准容器的迭代器都支持!=,而运算符<并不是所有容器都支持。

    5.STL中的一些坑

    //accumulate的第三个参数如果是0,那么返回的是int型2;如果参数是0.0,那么返回的是double型2.1
    vector<double> vec{1.1, 1};
    auto res = accumulate(vec.cbegin(), vec.cend(), 0.0)
    
    //10.5
    
    //10.7
  • 相关阅读:
    计算机视觉资源合集
    EMZ-搭建DL模型的最简便的方式 | 附项目地址
    在边缘设备上拟合大型神经网络的方法总结
    归一化方法总结 | 又名“BN和它的后浪们“
    名词解释 | 论文中的Ablation study
    知识蒸馏的简要概述
    如何看待计算机视觉未来的走向(二)从产品的角度聊一聊
    STL源码分析--functional
    STL源码分析--algorithm
    STL源码分析--bitset
  • 原文地址:https://www.cnblogs.com/season-peng/p/6759521.html
Copyright © 2011-2022 走看看