[力扣记录]C++常见对象的操作

58 阅读5分钟

C++和Python选手,记录一下自己的做题历程~

vector:

  1. 创建vector对象

    vector<typename> name;
    // 也可以直接初始化,例如:
    vector<int> a = [...]
    vector<int> b(a.begin(), a.end())
    
  2. 尾部插入数字

    vec.push_back(a);
    
  3. 使用下标访问元素

    cout<<vec[0]<<endl;
    
  4. 使用迭代器访问元素

    vector::iterator it;
    for(it = vec.begin(); it != vec.end(); it++)
        cout<<*it<<endl;
    
  5. 插入元素

    //在第i个元素后面插入a
    vec.insert(vec.begin()+i,a);
    
  6. 删除元素

    //删除第三个元素
    vec.erase(vec.begin()+2);
    //删除区间[i,j-1]区间
    vec.erase(vec.begin()+i-1,vec.begin()+j)
    
  7. 向量大小

    vec.size();
    
  8. 清空

    //清空之后,vec.size()为0
    vec.clear();
    

链表:

  1. 定义链表结构函数:

    struct ListNode {
         int val;
         ListNode *next;
         ListNode(int x) : val(x), next(NULL) {}
     };
    
  2. 若要访问链表中的数值,则:head->val;若访问链表的下一个值,则 head = head->next

哈希表:

  1. 建立基本数据类型的哈希表
unordered_map<int,int> m; //<string,string>,<char,char>
  1. 向哈希表中添加元素
  • insert 函数
m.insert(pair<int,int>(1, 10));
m.insert(pair<int,int>(2, 20));
  • 用数组方法直接添加
m[3]=30;
m[4]=40;
  1. 成员函数:
  • begin()、end()
m.begin() //指向哈希表的第一个容器
m.end()  //指向哈希表的最后一个容器,实则超出了哈希表的范围,为空
  • find()查找函数
m.find(2)  //查找key为2的键值对是否存在 ,若没找到则返回m.end()
if(m.find(2)!=m.end()) //判断找到了key为2的键值对
  • count()函数
// 例如:查找哈希表中key为3的键值对,返回其数量,为1,则找到,若没找到则返回0
m.count(3)  //返回 1
m.count(5)   //返回0
  • size()函数
m.size()   //返回哈希表的大小
  • empty()函数
m.empty()  //判断哈希表是否为空,返回值为true/false
  • clear()函数
m.clear()  //清空哈希表
  • swap()函数
// 交换两个哈希表中的元素,整个哈希表的键值对全部都交换过去
unordered_map<int,int> m1;
unordered_map<int,int> m2;
m1.swap(m2);
swap(m1,m2);
  1. 哈希表的遍历
  • 第一种方法
unordered_map<int, int> count;
for (auto p : count) {
    int front = p.first;   //key
    int end = p.second;   //value
}
  • 第二种方法
unordered_map<int, int> count;
for(auto it=m.begin();it!=m.end();it++)
{
    int front = it->first;   //key
    int end = it->second;   //value
}

树:

树是一种非线性的数据结构,相较于之前接触的队列、链表,树的一个节点可能会生成多个分支。

一般而言,一颗树有一个根节点,每个末端的节点被称为叶子结点。

  • 完全二叉树:除了最后一层外其它层的结点个数全满,而且最后一层的结点从左到右排满直到最后一个节点。
  • 满二叉树:所有层的结点全满:第n层有2^(n-1)个点,共有2^n-1个点
  1. 完全二叉树的存储

    • 一般以数组的[1]位置为根节点建立二叉树
    • 数组的[t]位置的左儿子和右儿子对应的位置分别为[2t]和[2t+1],父亲节点的位置为[t/2]。
  2. 一般二叉树的存储

    • 可以用数组下标模拟节点编号,用多个数组来记录节点信息。

    • 也可以用struct存。

      struct TreeNode {
          int val;
          int l,r,fa;
      }a[100001];
      
    • 用指针存储二叉树

      struct TreeNode {
          int val;
          TreeNode *l,*r,*fa;
      }
      TreeNode *root;
      
  3. 二叉树的基本操作

    • 新建节点

      struct TreeNode {
          int value;
          TreeNode *l, *r, *fa;//初始为NULL
          TreeNode(int x) {value = x;}
      }
      TreeNode *p = new TreeNode(x);
      
    • 根节点初始化

      TreeNode *root;
      root = new TreeNode(v);
      
    • 删除节点

      只需了解如何删除叶子结点,即将对应指针置为空即可。

    • 插入子节点

      void Insert(TreeNode *fa, TreeNode *p, int flag) {
          //flag = 0插入到左边,flag = 1插入到右边
          if(!flag)
              fa->l = p;
          else
              fa->r = p;
          p->fa = fa;
      }
      TreeNode *p = new TreeNode(v);
      Insert(fa,p,flag);
      
  4. 二叉树的遍历

    • 先序遍历(根->左->右)

      void PreOrder(TreeNode *p) {
          cout<<p->value<<endl;
          if(p->l) PreOrder(p->l);
          if(p->r) PreOrder(p->r);
      }
      
    • 中序遍历(左->根->右)

      void InOrder(TreeNode *p) {
          if(p->l) InOrder(p->l);
          cout<<p->value<<endl;
          if(p->r) InOrder(p->r);
      }
      InOrder(root);
      
    • 后序遍历

      void PostOrder(TreeNode *p) {
          if(p->l) PostOrder(p->l);
          if(p->r) PostOrder(p->r)
              cout<<p->value<<endl;
      }
      PostOrder(root);
      
  5. 层级遍历(BFS,从上到下遍历)

    TreeNode *q[N];
    ​
    void Bfs(TreeNode *root) {
        int front = 1, rear = 1;
        q[1] = root;
        while(front <= rear) {
            TreeNode *p = q[front];
            front++;
            cout<<p->value<<endl;
            if(p->l) q[++rear] = p->l;
            if(p->r) q[++rear] = p->r;
        }
    }
    Bfs(root);
    

集合:

1、set 的定义及初始化

set<Type> s                           //定义一个set容器
set<Type> s(s1)                       //定义一个set容器,并用容器s1来初始化
set<Type> s(b, e)                     //b和e分别为迭代器的开始和结束的标记
set<Type> s(s1.begin(), s1.begin()+3) //用容器s1的第0个到第2个值初始化s
set<Type> s(a, a + 5)                 //将a数组的元素初始化vec向量,不包括a[4]
set<Type> s(&a[1], &a[4])             //将a[1]~a[4]范围内的元素作为s的初始值

2、set 的基本操作

s.begin()                   //返回指向第一个元素的迭代器
s.end()                     //返回指向最后一个元素的迭代器
s.clear()                   //清除所有元素
s.count()                   //返回某个值元素的个数
s.empty()                   //如果集合为空,返回true,否则返回false
s.equal_range()             //返回集合中与给定值相等的上下限的两个迭代器
s.erase()                   //删除集合中的元素
s.find(k)                   //返回一个指向被查找到元素的迭代器
s.insert()                  //在集合中插入元素
s.lower_bound(k)            //返回一个迭代器,指向键值大于等于k的第一个元素
s.upper_bound(k)            //返回一个迭代器,指向键值大于k的第一个元素
s.max_size()                //返回集合能容纳的元素的最大限值
s.rbegin()                  //返回指向集合中最后一个元素的反向迭代器
s.rend()                    //返回指向集合中第一个元素的反向迭代器
s.size()                    //集合中元素的数目