programming review (c++): (1)vector, linked list, stack, queue, map, string, bit manipulation

编程题常用知识点的review。

most important:  想好(1)详尽步骤(2)边界特例,再开始写代码。

I.vector

#include <iostream>
//0.头文件。 特性:  连续存储,动态双倍分配增长
#include <vector>
#include <algorithm> //relevant
using namespace std;

bool comp(int a,int b){
    return a>b;
}

int main(){
    
    //1.创建与初始化
    vector<int> v1(10,0);
    vector<int> v2(v1);     //也可拷贝初始化 vector<int>  v2=v1;
    vector<vector<int>> ivec(10,v1);    //二维vector
    
    //2.返回数量与判断空
    if(v1.empty())
        cout<<"it's empty";
    auto n=v1.size();
    
    //3.修改元素与遍历元素
    for(int i=0;i<n;i++)
        v1[i]=1;
    
    vector<int>::iterator it;   //迭代器
    for(it=v1.begin();it!=v1.end();it++)
        *it=1;
        
    //4.插入与删除元素
    v1.push_back(9);
    v1.pop_back();
    
    v1.insert(v1.begin()+3, 9);     //把9插入到第3个元素后面
    v1.erase(v1.begin()+3);         //把第3个元素后面的那个元素删掉
    
    //5.相关函数 reverse sort
    reverse(v1.begin(),v1.end());
    sort(v1.begin(),v1.end(),comp);    //等价于  sort(v1.rbegin(),v1.rend());
    
}

II.linked list

#include <iostream>
#include <vector>
//0.struct

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}   //定义了节点的初始化方法
};


using namespace std;


int main(){
    
    vector<int> ivec{1,2,3,4,5,6};
    //1.创建与初始化
    ListNode *head=new ListNode(0);     //申请一个新节点,注意 head= new ListNode(0)与 head= ListNode(0)的区别
    ListNode *p=head,*q;
    for(auto i:ivec){           //此乃尾插法,还有头插法,根据情况选择合适的,注意现在有头节点
        q=new ListNode(i);
        p->next=q;
        p=q;
    }
    
    //2.遍历元素、插入删除元素
    p=head;
    while(p->next!=NULL){
        if(p->next->val==3){
            q=new ListNode(0);
            q->next=p->next->next;
            p->next=q;
        }
    }
    
    /* 3.经典操作:   (1) 原地reverse——头插法和尾插法的运用;
                    (2) 判断cycle——快慢指针;
                    (3) 找中间节点、找间隔节点——快慢指针;
     }
    */
    
}

III.stack && queue

#include <iostream>
#include <vector>

//0.头文件   经常以vector模拟
#include <stack>
#include <queue>

using namespace std;


int main(){
    
    //1.stack  创建与初始化,基本操作  push pop top empty size
    stack<int> myStack;
    myStack.push(9);
    myStack.push(8);
    cout<<myStack.top()<<endl;
    myStack.pop();
    cout<<myStack.size()<<myStack.empty()<<endl;
    
    
    //2.queue   创建与初始化,基本操作  push pop front back empty size
    queue<int> myQueue;
    myQueue.push(9);
    myQueue.push(8);
    cout<<myQueue.front()<<endl;
    cout<<myQueue.back()<<endl;
    myQueue.pop();
    cout<<myQueue.size()<<myQueue.empty()<<endl;
    
}

IV.map

#include <iostream>
//0.头文件   优点:快速访问/空间换时间/桶的思想,key用来去重,value用来存辅助信息。注意,有时直接用数组进行hash,而不需要借助<map>
#include <map>
using namespace std;

int main(){
    
    //1.创建
    map<string,int> myMap;
    
    //2.访问、修改、增加元素
    myMap["Tom"]=1;  myMap["Lucy"]=3;  myMap["Jack"]=2;
    
    //3.删除元素
    myMap.erase("Tom");      //也可使用   myMap.erase(myMap.find("hi"));
    
    //4.通过key查找元素
    if (myMap.find("Tom")==myMap.end())
        cout<<myMap.count("Tom")<<endl;
    
    //5.遍历,map内部以key的升序排列
    for(auto it=myMap.begin();it!=myMap.end();it++){
        cout<<it->first<<endl;
        cout<<it->second<<endl;
    }
    
}

V.string

#include <iostream>
#include <vector>
//0.头文件
#include <string>
#include<sstream>  //辅助

using namespace std;

int main(){
    
    //1.创建,初始化
    string x="hello world",y="ld s";
    getline(cin,y);   //获得一行,也可再加个终止符参数
    
    //2.常用函数与vector相同  empty, size, push_back, 下标访问
    
    //3.+ - < > =运算符的重载
    
    //4.关于字符变量函数 isalnum,isalpha,isdigit    tolower,toupper
    
    //5.获得子串
    string sub=x.substr(1,3); // 第1个位置开始,长度为3的子串
    
    //6.交换两个字符串
    y.swap(x);

    //7.查找字串
    auto t=y.find(x,0);
    if(t!=string::npos)
        cout<<t;
    
    //8.split功能
    istringstream strcin(x);
    string s;
    vector<string> res;
    while(strcin >> s)
        res.push_back(s);

}

VI.bit manipulation

  1. 与                          a&b          1010&1100=1000   
  2. 或                      a|b         1010|1100=1110
  3. 异或                              a^b          1010^1100=1001
  4. 按位取反                         ~a            ~1010=0101 
  5. 左移                              a<<1      1010<<1=10100
  6. 带符号右移                     a>>1        -1010>>1=-101
  7. 无符号右移                     a>>>1   
 
 
原文地址:https://www.cnblogs.com/aezero/p/5268467.html