计算机上级复试资料

1. 入门并实践STL——vector篇

2019-02-26  本文已影响0人  zju_dream

此笔记整理自《算法笔记》电子版下载 密码:yhpimb
其他资料:STL教程:C++ STL快速入门(非常详细)

1. vector

  1. How to use?
#include<vector>
using namespace std; // 这样就可以在代码中使用vector了
  1. vector的定义
  1. vector容器内元素的访问

    1. 下标访问:name[index]name[0], 访问范围为0~size-1
    2. 迭代器访问:
      • 定义迭代器(一种类似指针的东西)
        vector<typename>::iterator it; typename是定义vector时填写的类型。
      • 使用迭代器
      vector<int> vi;
      // init
      for(int i = 0; i < 5; i++) {
          vi.push_back(i);
      }
      
      vector<int>::iterator it = vi.begin();
      for(int i = 0; i < 5; i++) {
          printf("%d", *(it+1)); // 输出vi[i]
      }
      
      • 使用迭代器+自增
      // vector的迭代器不支持it<vi.end()的写法,因此循环条件只能使用下方的方式
      for(vector<int>::iterator it; it != vi.end(); it++) {
           printf("%d", *it); 
      }
      
      从这里看出vi[i]和*(vi.begin() + i)是等价的
      • 特殊函数
        • vi[i].begin(): 获取首元素的地址
        • vi[i].end(): 获取尾元素地址的下一个地址,end()作为迭代器末尾标志,不存储任何元素。(美国人的思维比较习惯左闭右开)
        • 此外迭代器还可以it++, ++it
      • 注意:只有在vector和string中,才允许使用vi.begin()+1这种迭代器加上整数的写法
  2. vector常用函数

    1. push_back()
      在vector后面添加一个元素,时间复杂度为O(1).
    #include<vector>
    using namespace std;
    
    int main() {
        vector<int> vi;
    
        for(int i = 0; i < 5; i++) {
            vi.push_back(i);
        }
        for(int j = 0; j < vi.size(); j++) {
            printf("%d ", vi[j]);
        }
        system("pause");
        return 0;
    }
    

    输出结果:1 2 3

    1. pop_back()
      删除尾元素,O(1)
    2. size()
      返回类型是unsigned,获得vector中的元素个数,O(1)
    3. clear()
      清楚vector中所有的元素,O(n)
    4. insert()
      insert(it, x)用来向vector的任意迭代器it处插入一个元素,O(n)
      vi.insert(vi.begin()+1, -1); // -1将插入vi[1]的位置
    5. erase()
      • 删除单个元素: vi.erase(it.begin() + 1) // 删除vi[1]
      • 删除一个区间内的所有元素:
        erase(first, last): 删除[first, last)内的所有元素
        vi.erase(it.begin() + 1, it.begin() + 3) // 删除vi[1], vi[2]
      • 复杂度都为O(n)
  3. vector的常见用途

    1. 存储数据
    2. 用邻接表存储图

练题网址-vector

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int getkey(char *name) {
    int key = 0;
    for(int i = 0; i < 3; i++)
        key= 26 * key+ (name[i] - 'A');
    key= key * 10 + (name[3] - '0');
    return key;
}
int main() {
    
    vector<vector<int> > students(182800); 
    int N, K;
    scanf("%d%d", &N, &K);

    // For each course, round up all students who sign up this course. 
    for(int h = 1; h <= K; h++) {
        int i, Ni; // i means the course id, Ni means how many students choose this course
        scanf("%d%d", &i,&Ni);
        char name[5];
        for(int j = 0; j < Ni; j++) {
            scanf("%s", name);
            //printf("[%s]", name);
            students[getkey(name)].push_back(i);
        }
    }

    for(int a = 0; a < N; a++) {
        char name[5];
        scanf("%s", name);
        int name_id = getkey(name);
        int nr = students[name_id].size();
        printf("%s %d ", name, nr);
        // sort
        sort(students[name_id].begin(), students[name_id].end());
        for(vector<int>::iterator it = students[name_id].begin(); it != students[name_id].end(); it++) {
            if(it == students[name_id].end()) {
                        printf("%d", *it);  
                    }
                else {
                    printf("%d ", *it);
                }
        }
        
        printf("\n");
        
    }
    return 0;
}
上一篇下一篇

猜你喜欢

热点阅读