• 牛客网--华为机试题相关知识(未完)


    一、 cin、getline()、cin.getline()区别

    C++输入过程中,是把输入加载到缓冲区中,然后对缓冲区中的字符进行读取。

    1. cin

    结束条件:[enter],[space],[tab]

    处理方法:cin遇到缓冲区中的[enter],[space],[tab]会结束当前输入,并舍弃[enter],[space],[tab],继续下一项输入,当有连续[space],[enter,[tab]会全部舍弃。

    2. getline()

    用于string类的。使用需包含头文件#include<string>。getline(cin,string s),接收一个字符串,可以接收空格、回车等

    与cin.getline()的区别:1.cin.getline()接收输入字符串的是数组,getline()是string类型

                                        2.cin.getline()可以接收空格,但不能接收回车;getline()可以接收空格和回车

                                        3.cin.getline()会在数组结尾是'',getline()不会

    3. cin.getline()

    实际是cin.getline(接收字符串到m,接收个数n,结束字符)。接收一个字符串,可以接收空格等,最后一个字符为‘’。结束符可以通过设置第三个参数自己设置,默认是回车。m不能为string类型。

    注意:实际接收到的要比n少一个,因为最后一个字符为''。

    二、 字符串类型String

    string类型的字符串是不以‘’结尾的,因此若str有三个字符,传统C语言的字符串的str[3]是字符‘’,但是string类型的只能到str[2],str[3]是没有定义的。

    要使用strlen()、strcpy()函数需要包含C语言的字符串操作函数头文件。

    #include <string.h>
    using namespace std;
    //上述两行代码等价于下面一行代码
    #include <cstring>

    #include <string>

    using namespace std;

    string str;

    1. str.length()

    返回字符串的长度. 这个数字应该和size()返回的数字相同。

    2. str.size()

    函数返回字符串中现在拥有的字符数。

    3. str.append()

    str.append(num, ch):末尾添加num个字符ch;

    str.append(str1, index, len):末尾添加str1的字符串,下标从inddex开始,长度len;

    4.  str.substr()

    str.substr(index, num):返回本字符串的一个子串,从index开始,长num个字符。如果没有指定num,函数将简单的返回从index开始的剩余的字符串。妙用:剪切字符串

    5. str.begin() str.end()

    迭代器

    6. str.rbegin() str.rend()

    逆迭代器

    7. str.find()

    size_t position = str.find(const basic_string &s, size_type length );  //从下标index开始,寻找长度为length,返回字符串s在str中第一次出现的位置。未找到返回string::npos。

    size_t position = str.find( char ch, size_type index );  //从下标index开始,返回字符ch在str中第一次出现的位置。未找到返回string::npos。

    8. str.find_first_of()

    同find()。

    三、 vector set map queue

    1. vector

    基础知识:

    vector是表示可变大小数组的序列容器。

    就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。

    本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。

    注意:

    想对vector直接赋值就得定义大小,如果不定义大小,直接赋值会出错,只能用push_back

    常用操作:

    #include <vector>

    typedef struct test{

      ...

    };

    test tt;

    vector<test> sec;

    sec.push_back(tt);

    vector< ElemetType> vec;

    vector< ElemetType> tmp;  //非空

    ElemetType b[N]={....};

    访问:

    • vec.back():末尾元素
    • vec.front():第一个元素

    容量:

    • vec.size();

    修改:

    • vec.push_back():末尾添加
    • vec.pop_back():末尾删除
    • vec.assign(b,b+N)
    • vec=tmp

    迭代器:

    • vec.begin():开始
    • vec.end():结束

    算法:

    遍历:
    vector<int>::iterator it; for(it=vec.begin(); it!=vec.end(); it++) cout<<vec[it]<<endl; //或者 for (size_t i = 0; i < vec.size(); i++) { cout << vec.at(i) << endl; }
    sec.(...);
    翻转:
    #include <algorithm> reverse(vec.begin(), vec.end());
    元素排序
    #include <algorithm> sort(vec.begin(), vec.end()); //采用的是从小到大的排序 //如果想从大到小排序,可以采用上面反转函数,也可以采用下面方法: bool Comp(const int& a, const int& b) { return a > b; } sort(vec.begin(), vec.end(), Comp);

    2. set

    set作为一个容器是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序,set中数元素的值不能直接被改变。C++ STL中标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树:红黑树,也成为RB树(Red-Black Tree)。

    #include <set>

    ElementType a[N]={...};

    set<ElementType> iset(a, a+N);

    ElementType X;

    iset.insert(X);

    迭代:

     for(set<ElementType>::iterator it=iset.begin();it!=iset.end();it++)
         cout<<*it<<endl;

    3. map

    Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一 种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的。

    #include <map>

    map对象是模板类,需要关键字和存储对象两个模板参数:

    std:map<int,string> personnel;

    插入:

    数组形式:

    例如mapStudent[1] = "student_one";  可覆盖原先数据。

    大小:mapStudent.size();

    遍历:

    map<int, string>::iterator iter;  
    for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)  
        cout<<iter->first<<' '<<iter->second<<endl; 

     4. queue

    添加头文件:

    #include <queue>

    常用的成员函数:

    queue<ElementType> q;
    q.push(...);
    q.pop();    //没有返回值
    q.size();
    q.empty;    //空返回true
    ElementType t=q.front();    //返回第一个元素,没有出队
    ElementType t=q.back();    //返回最后一个元素

    四、 cout利用控制符dec、hex、oct分别输出十进制、十六进制、八进制

    默认进制为十进制,在修改进制之前,原来格式一直有效。

    cout<<hex<<a;

    cout<<oct<<a;

    相关知识点:

    用输出流输出的都是字符串;

    五、字符串与其他类型转换

    其他类型转字符串:

    c++11标准增加了全局函数std::to_string:

    string to_string (int val);

    string to_string (long val);

    string to_string (long long val);

    string to_string (unsigned val);

    string to_string (unsigned long val);

    string to_string (unsigned long long val);

    string to_string (float val);

    string to_string (double val);

    string to_string (long double val);

    例如:

    int n;

    string str=to_string(n);

    字符串转其他类型:

    采用标准库中atoi函数,对于其他类型也都有相应的标准库函数,比如浮点型atof(),long型atol()等等

    例如:

    std::string str = "123";
    int n = atoi(str.c_str());
    cout<<n; //123

    atoi函数原型:

    int atoi(const char *nptr);

    如果第一个非空格字符存在,是数字或者正负号则开始做类型转换,之后检测到非数字(包括结束符 ) 字符时停止转换,返回整型数。否则,返回零,

    const char *c_str();

    c_str()函数返回一个指向正规C字符串的指针常量, 内容与本string串相同.(其实它指向的是string对象内部真正的char缓冲区),所以返回const,以防止用户的修改。

    六、stringstream类

    要想在程序中使用 stringstream 类,我们需要在源程序文件中包含头文件include<sstream>。

    例程:

    #include <sstream>
    float dollar = 1.00;
    stringstream ss;
    ss << "dozen: " << dozen << endl;

    1. 类型转换

    string -> double/int

    #include <iostream>
    #include <sstream>
    using namespace std;
    
    int main()  
    
    {  
    
        double  dVal;    
        int     iVal;
        string  str;
        stringstream ss;
    // string -> double str = "123.456789"; ss << str; ss >> dVal; cout << "dVal: " << dVal << endl; // string -> int str = "654321"; ss.clear(); ss << str; ss >> iVal; cout << "iVal: " << iVal << endl; return 0; }

    输出: dVal: 123.457

    iVal: 654231

    2 格式化输入

    string inputString("123abc 123.4one two three four");
        stringstream ss(inputString);
        string s;
        int i;
        double d;
        ss >> i >> s >> d;
        cout << i << " " << s.c_str() << " " << d ;
        while (ss >> s)
            cout <<" "<<s.c_str();
        cout << endl;

    华为题目:英文单词逆序排放 I am a boy -> boy a am I

    string s;
    getline(cin,s);
    stringstream ss(s);        //赋值
    string res="", tmp;
    while (ss>>tmp) {        //空格
         if (res=="")
             res=tmp;
         else
             es=tmp+" "+res;
        }
    cout<<res;

     七、algorithm库一些常用的方法

    1. sort 排序

    语法描述:sort(begin,end,cmp),cmp参数可以没有,如果没有默认非降序排序。

    结构体排序:降序

    struct text{
        string str;
        int a;
    };
    bool cmp(link x,link y)
    {
        return x.a>y.a;
    }
    vector<text> vec;    //变量类型是结构体
    ......
    sort(vec.begin(),vec.end(),cmp);

    2. count

    例子:查找字符串中空格数目

    string str;
    cin>>str;
    int blank_number=count(str.begin(), str.end(), ' ');

     八、 isalpha、isalnum、islower、isupper用法

    1.isalpha

    isalpha()用来判断一个字符是否为字母,如果是字符则返回非零,否则返回零。

    cout << isalpha('a');//返回非零
    cout << isalpha('2');//返回0

    2.isalnum

    isalnum()用来判断一个字符是否为数字或者字母,也就是说判断一个字符是否属于a~z||A~Z||0~9。

    cout << isalnum('a');//输出非零
    cout << isalnum('2');//非零
    cout << isalnum('.');//

    3.islower

    islower()用来判断一个字符是否为小写字母,也就是是否属于a~z。

    cout << islower('a');//非零
    cout << islower('2');//输出0
    cout << islower('A');//输出0

    4.isupper

    isupper()和islower相反,用来判断一个字符是否为大写字母。

    cout << isupper('a');//返回0
    cout << isupper('2');//返回0
    cout << isupper('A');//返回非零
  • 相关阅读:
    【程序25】
    【程序24】
    【程序23】
    【程序22】
    【程序21】
    【程序20】
    【程序19】
    【程序18】
    string用法总结
    快速排序
  • 原文地址:https://www.cnblogs.com/learning-zjx/p/10567905.html
Copyright © 2020-2023  润新知