记录c++常用库和语法
2670
2021.10.09
2022.01.19
发布于 未知归属地

list

//把vec的数据初始化给list
list<int> l(vec.begin(), vec.end());
//前向定位
auto it = l.begin();
advance(it, j);

pair

pair<T1, T2> p1;            //创建一个空的pair对象(使用默认构造),它的两个元素分别是T1和T2类型,采用值初始化。
pair<T1, T2> p1(v1, v2);    //创建一个pair对象,它的两个元素分别是T1和T2类型,其中first成员初始化为v1,second成员初始化为v2。
pair<T1, T2> p2 = make_pair(v1, v2);          // 以v1和v2的值创建一个新的pair对象,其元素类型分别是v1和v2的类型。
p1 < p2;                    // 两个pair对象间的小于运算,其定义遵循字典次序:如 p1.first < p2.first 或者 !(p2.first < p1.first) && (p1.second < p2.second) 则返回true。
p1 == p2;                  // 如果两个对象的first和second依次相等,则这两个对象相等;该运算使用元素的==操作符。
p1.first;                   // 返回对象p1中名为first的公有数据成员
p1.second;                 // 返回对象p1中名为second的公有数据成员

string和char*相互转换

string str="gdfd"; 
consta char* constc = NULL;
contc = str.c_tr();//string->const char*
c = const_cat<char*>(constc)//const char*->char*

//但是如果是在函数中return,因为局部变量在stack上,出了作用域就会被销毁
char* res_c = new char[res.size()];
for(int i=0; i<res.size(); i++)
    res_c[i] = res[i];
cout<<res_c;
string s1("demo1"); 

char *

 char* str="abc";
//str指向的是静态存储区,"abcdef"是位于常量区的,指针str只是指向了这个位置
char str[]="abc";
//这个数组的存储空间是在栈中开辟的,也就是说它的每个元素一次为'a','b','c','\0'

当char *s = “hello”;后,不能使用s[0]=‘a’;语句进行赋值。这是将提示内存不能为"written"。

当用char s[]=“hello”;后,完全可以使用s[0]=‘a’;进行赋值,这是常规的数组操作。

随机数

int v = rand()%(b-a+1)+a;
//v属于[a,b]

字符串

1.整数转字符串

c++
#include <sstream>
str = to_string(x);

字符串转整数

    string s = "12";
    int a = atoi(s.c_str());

2.反转字符串

#include <algorithm>
reverse(s.begin(),s.end());

3.截取字符串

s.substr(pos, n)//截取s中从pos开始(包括0)的n个字符的子串,并返回

4.查找子串

s.find(s1)         //查找s中第一次出现s1的位置,并返回(包括0)

s.rfind(s1)        //查找s中最后次出现s1的位置,并返回(包括0)

s.find_first_of(s1)       //查找在s1中任意一个字符在s中第一次出现的位置,并返回(包括0)

s.find_last_of(s1)       //查找在s1中任意一个字符在s中最后一次出现的位置,并返回(包括0)

5.删除字符

s.erase(begin_pos, size);

替换字符串

s.replace(pos, n, s1)    //用s1替换s中从pos开始(包括0)的n个字符的子串

map

1.插入与初始化

// 定义一个map对象
map<int, string> mapStudent;
 
// 第一种 用insert函數插入pair
mapStudent.insert(pair<int, string>(000, "student_zero"));
//pair用.
 
// 第二种 用"array"方式插入
mapStudent[123] = "student_first";
mapStudent[456] = "student_second";

2.查找

mapStudent.count("123")!
iter = mapStudent.find("123");
if(iter != mapStudent.end())
       cout<<iter->second<<endl;

3.删除

//迭代器刪除
iter = mapStudent.find("123");
mapStudent.erase(iter);
 
//用关键字刪除
int n = mapStudent.erase("123"); //如果刪除了會返回1,否則返回0
 
//用迭代器范围刪除 : 把整个map清空
mapStudent.erase(mapStudent.begin(), mapStudent.end());
//等同于mapStudent.clear()

4.遍历map

     map<int, string>::iterator  iter;
     for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++){
          cout<<iter->first<<" "<<iter->second<<endl;
     }
    for(auto item:myStudent){
        cout<<item.first<<item.second;
    }
//数组方式(已有key了)
    int iSize = mapStudent.size();
    for(int i = 1; i <= iSize; i++){
        cout<<i<<" "<<mapStudent[i]<<endl;
    }

5.排序

//默认排序:从小到大
//从大到小
map<string, int, greater<string> > mapStudent;

//自定义
struct CmpByKeyLength {  
  bool operator()(const string& k1, const string& k2) {  
    return k1.length() < k2.length();  
  }  
}; 
map<string, int, CmpByKeyLength > mapStudent; 

int极值

#include<limits.h>
INT_MAX
INT_MIN

set

set<int> s; //unordered_set 更快
s.insert(1);
s.count(1)//1出现的次数
//遍历
for(iter = s.begin() ; iter != s.end() ; ++iter)
{
    cout<<*iter<<" ";
}

//自动排序 得到第n个丑数
int nthUglyNumber(int n) {
        set<double> s;  // set 是有序的,且不重复
        double answer = 1;
        for (int i = 1; i < n; i++) {
            s.insert(answer * 2);
            s.insert(answer * 3);
            s.insert(answer * 5);
            answer = *s.begin(); s.erase(answer);
        }
        return answer;

vector

关于vector.size()

vector.size()返回的是无符号整数,因此vector.size()>-1会返回0,一定要用(int)vector.size()

初始化

vector<int> vec;
vec = vector<int>(size);
vec.resize(size);
vector<int> vec(size, value);
vector<vector<int>> newOne(r,vector<int>(c,0)); 

排序

bool mycomp(int i, int j) {
    return (i < j);
}

int main() {
    std::vector<int> myvector{ 32, 71, 12, 45, 26, 80, 53, 33 };
    //调用第一种语法格式,对 32、71、12、45 进行排序
    std::sort(myvector.begin(), myvector.begin() + 4); //(12 32 45 71) 26 80 53 33
    //调用第二种语法格式,利用STL标准库提供的其它比较规则(比如 greater<T>)进行排序
    std::sort(myvector.begin(), myvector.begin() + 4, std::greater<int>()); //(71 45 32 12) 26 80 53 33
    return 0;
}

指定位置插入元素

a.insert(a.begin()+1,5); //在a的第1个元素(从第0个算起)的位置插入数值5,如a为1,2,3,4,插入元素后为1,5,2,3,4

添加元素

vec.push_back(3);

1.截取

//1,2,3,4,5,6,7,8,9,10
vector<int>::iterator fist1 = Arrs.begin() + 2; // 第三个迭代器
vector<int>::iterator last1 = Arrs.end() - 1; // 倒数第二个迭代器
vector<int> Arrs2(first1, last1); // 创建整型的容器,并初始化为Arrs的第三个到第八个:{3,4,5,6,7,8}
vector<int> Arrs1(Arrs.begin(), Arrs.end());//1,2,3,4,5,6,7,8,9,10
vector<int> Arrs1(Arrs.begin(), Arrs.begin()+1);//1
vector<int> Arrs1(Arrs.begin(), Arrs.end()-1);//1,2,3,4,5,6,7,8,9

2.删除

vector<int>::iterator it = vec.begin();
vec.erase(it+k);
vec.pop_back();//删除最后
//注意 vector申请的连续的空间 使用erase后后面的迭代器会失效。但是erase会返回下一个有效的迭代器

vector vec = { 1,2,3,4,5 };
vector::iterator it = vec.begin();
for (; it != vec.end(); it++) {
if (*it == 3) it = vec.erase(it);
}

3. iterator遍历

用*it访问值

查找元素索引

 vector<int>::iterator result = find( L.begin( ), L.end( ), 3 ); //查找3

构建链表

  struct ListNode {
      int val;
      ListNode *next;
      ListNode() : val(0), next(nullptr) {}
      ListNode(int x) : val(x), next(nullptr) {}
  };
//构建
ListNode *l = new ListNode();
ListNode *p = l;
for(int i=0; i<n; i++){
    p->next = new ListNode(i);
    p = p->next;
}
return l->next;

stack

#include <stack> 
stack< int > s;
/**
empty() 堆栈为空则返回真

pop() 移除栈顶元素

push() 在栈顶增加元素

size() 返回栈中元素数目

top() 返回栈顶元素
**/

队列

1 优先级队列

//可以利用其实现最小堆 其实set也可以!默认有序的!!!
 #include <queue>
priority_queue<long, vector<long>, greater<long>> heap;
1 //升序队列,小顶堆
2 priority_queue <int,vector<int>,greater<int> > q;
3 //降序队列,大顶堆
4 priority_queue <int,vector<int>,less<int> >q;

heap.push(next);
item = heap.top();
heap.pop();

queue <int> myQ;
myQ.push(i);
myQ.pop();
int peek =myQ.front();

双端队列

deque<int> dq;
dq.push_back();
dq.push_front();
dq.pop_back();
dq.pop_front();
//并且可以自由访问每个元素 dq[k]

带参数的构造函数

class MyClass
{
private:
    int m1_int;
    double m2_double;
public:
    MyClass(int m1, double m2) : m1_int(m1), m2_double(m2){}

private:
    int m1_int;
    double m2_double;
} ;
int main(){
    MyClass myclass1;//调用第一种形式的构造函数
    MyClass myclass(2,0.3);//调用第二种形式的构造函数
    
    //或者用下面的方式创建对象
    MyClass myclass1 = MyClass();//调用第一种形式的构造函数
    MyClass myclass2 = MyClass(2,0.3);//调用第二种形式的构造函
}
评论 (0)