牛客网刷题记录

1、原码、反码、补码的概念:   正数的原码、反码、补码是一样的,即看到符号位(第一位)是0,就可以照着写其他两种码;负数的反码符号位不变,数值位分别“按位取反”。负数的补码是原码的反码末位加1。整数的补码才是在计算机中的存储形式。

2、逻辑语句从左到右执行,如果前面的条件语句满足了整个条件,那么后面的语句就不执行了。

3、字符串的赋值问题:

牛客网刷题记录_第1张图片像如图中所采用的的赋值方法都是错误的,编译没有错误,但运行就会奔溃,原因是进入了错误的地址。

原因是如下,有的字符串是不能被修改的。

牛客网刷题记录_第2张图片

4、vector的用法

#include

vector v1(10);                                                  // V1有10个元素,每个元素的值都是0.

vector v2{10};                                                  // V2有1个元素,该元素的值是10.

vector v3(10,1);                                               // V3有10个元素,每个元素的值是1。

vector v4{10,1} == vector v4 = {10,1};    // v4有两个元素,分别是10和1

vector v5 = v1 == vector v5(v1);             // v5中包含所有v1所有元素的副本

vector v6;                                                        // v6是一个空的vector。

关于vector的若干重要操作:

v.empty()                                 如果V不含有任何元素,返回真;否则返回假

v.size()                                    返回V中元素的个数

v.push_back(t)                        向V的尾端添加t

v.pop_back()                          删除末尾元素

v.insert()                                 任意位置插入元素

vec.insert(vec.begin()+i,num);//插入完成后新数字的位置就是vec.begin()+i

v.erase()                                 任意位置删除元素

v.clear()                                  清空

v.begin()                                 开始指针

v.end()                                    末尾指针:得到数组的最后一个单元+1的指针

v[n]                                         返回V中第N个位置上元素的索引,同数组用法

从键盘获得数字初始化的时候只能是,int n;cin>>n;v.push_back(n);

获取vector元素的方法:也可以直接dian string s = vec[0];

   string str;
    vector vec;
    str = "zhaonan";
    vec.push_back(str);
    vector::iterator iter = vec.begin();
    string a = *iter;

vector用作引用:

牛客网刷题记录_第3张图片

反转:1、#include    reverse(a.begin(),a.end())

           2、std::reverse(a.begin(),a.end())

5.1、stack,继承自vector的栈

c++ stl栈stack的头文件为: #include  

c++ stl栈stack的成员函数介绍

empty() 堆栈为空则返回真

pop() 移除栈顶元素

push() 在栈顶增加元素

size() 返回栈中元素数目

top() 返回栈顶元素

5.2、队列

可能需要#include

queue q;     // 示例用法。

push() 在末尾加入一个元素
pop() 弹出队列当中第一个值

front()返回队列中第一个元素

back()返回对垒最后一个元素

empty()队列为空时返回真

size()大小

//----------------------------------------- 读取堆栈的栈顶元素
#include 
#include 
using namespace std;
int main()
{
    // 创建堆栈对象
    stack s;
    // 元素入栈
    s.push(3);
    s.push(19);
    s.push(23);
    s.push(36);
    s.push(50);
    s.push(4);
 
    // 元素依次出栈
    while(!s.empty())
    {
        // 打印栈顶元素,打印出:4 50 36 23 19 3
        cout << s.top() << endl;
        // 出栈
        s.pop();
    }
 
    return 0;
}

6 、输入几个数的停止操作,Enter键结束输入。

     while(cin >> n){
      if (getchar() == '\n')
		{
			break;
		}
     }

7、字符串:有两种分别为C-风格字符串和基于string类的字符串

C-风格字符串特殊性质:以空字符结尾,空字符被写作\0,其ASCII码为0。其初始化有三种方式:

char cat[8] = {'f','a','t','e','s','a','\0'};  // 在我眼中'a'就是97,这种方法显式'\0'
char bird[11] = "zhaonan";                     // '\0'隐式存在
char fish[] = "Bubbles";                       // 编译器自动计算大小

字符串的输入问题:cin使用空白(空格,制表符和换行符)来确定字符串的结束位置。面向行的输入有类(如cin)成员函数:getline()和get(),这两函数都读取一行,直到碰到换行符,前者将丢弃换行符,后者将换行符保留在输入队列中。

getchar();获取输入行中下一个字符

strlen(char *)可获得char *字符串长度,但是sizeof(char *) == 4;

8、常用的algorithm算法

sort(开始指针;结束指针;标志位(默认为从小到大));

sort(numbers.begin(),numbers.end(),hhhhhh); // 其中hhhhhh为bool类型,sort函数就是让首地址和末
                                               地址之间的元素都满足标志位的比较函数

reverse(开始指针;结束指针);   // 反转

9、字符串与数字的转换与字符串相加

记得#include

键盘键入数字后转换成string的两种方式:

    string s1,s2;
    // 方式一,直接cin
    cin >> s1 >> s2;
    // 方式二,其中x1,x2为整型
    //s1 = to_string(x1);
    //s2 = to_string(x2);

string类型转换为int类型:int n = atoi(s.c_str());   

c_str()函数返回一个指向正规C字符串的指针常量, 内容与本string串相同. 
这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。
注意:一定要使用strcpy()函数 等来操作函数c_str()返回的指针。

两个string字符串相加:直接s1+s2;

两个string字符串比较大小:int n = s1.compare(s2); 也可以直接s1 > s2;

string的长度:s1.length(); == s1.size();

string的排序:sort(s1.begin(), s1.end());

string的substr两个用法:

string str.substr(nStart)         // 默认 从str字符串nStart位置开始截取到str结束为止
string str.substr(nStart, nLength)// 从str字符串nStart位置开始截取nLength个字符!如果nLength>
                                     剩余的字符则截取到str结束为止
string str("123456asdf");

string strTmp1= str.substr(1);    // 获得字符串str中 从第1位开始到结束的字符串,strTmp1值
                                     为:"23456asdf"
string strTmp2 = str.substr(1,5); // 获得字符串s中 从第1位开始的长度为5的字符串,strTmp1值
                                     为:"23456"

 初始化:

    string str;
	str[0] = 'a';
	str[1] = 's';
	cout  << str[0];
这样的方式是不对的

读取一行:getline(cin,str);

字符串反转:

牛客网刷题记录_第4张图片

 

10 set的用法

#include  set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。

begin()        ,返回set容器的第一个元素 

end()      ,返回set容器的最后一个元素

clear()          ,删除set容器中的所有的元素

empty()    ,判断set容器是否为空

max_size()   ,返回set容器可能包含的元素最大个数

size()      ,返回当前set容器中的元素个数

count()             用来查找set中某个某个键值出现的次数。这个函数在set并不是很实用,因为一个键值在set只可能出现0或1次,                           这样就变成了判断某一键值是否在set出现过了

insert()

如何取出set容器中的元素见下面代码:

for(set::iterator iter = ss.begin(); iter != ss.end(); iter++) 
                vec.push_back(*iter);

11、map

#include

size()   返回元素个数

int FirstNotRepeatingChar(string str) {
        int nlength = str.size();
        map temp;
        int i;
        for(i = 0; i < nlength; i++)
            temp[str[i]]++;
        for(i = 0; i < nlength; i++)
        {
            if(temp[str[i]] == 1)
                break;
        }
        if(i == nlength)
            return -1;
        else
            return i;
    }

可以看出,键是下标,值是对应的内容,值为int时,默认为0;使用[]可以改变通过键改变值,但使用insert函数时不可以有重复的键,否则插不进去。输出

//map内部本身就是按照key的大小顺序进行存储的
for(map::iterator it = temp.begin(); it != temp.end(); it++)
    cout << (*it).first << " " << (*it).second << endl;
        
for(map::iterator it=m.begin();it!=m.end();++it){
    cout << it->first << " "<< it->second << endl;

不按键值排序的map:unordered_map,其他一样。 #include

12、关于输出

可以看出标准输入默认保留了6位数字,但有时候会有小数点后4位等要求。

需要#include

    double value = 12.3456789;
    cout << value << endl; // 默认以6精度,所以输出为 12.3457
    cout << setprecision(4) << value << endl; // 改成4精度,所以输出为12.35
    cout << setprecision(8) << value << endl; // 改成8精度,所以输出为12.345679
    cout << fixed << setprecision(4) << value << endl; // 加了fixed意味着是固定点方式显示,所
                                                          以这里的精度指的是小数位,输出为
                                                          12.3457
    cout << value << endl; // fixed和setprecision的作用还在,依然显示12.3457
    cout.unsetf( ios::fixed ); // 去掉了fixed,所以精度恢复成整个数值的有效位数,显示为12.35
    cout << value << endl;
    cout.precision( 6 ); // 恢复成原来的样子,输出为12.3457
    cout << value << endl;

13、i的j次方:pow(i,j); 

 

你可能感兴趣的:(C++)