基础数据结构(C++)

写了好几篇水题的题解,来点硬货

一、动态数组(vector)

1.介绍
有些时候想开一个数组,但是却不知道应该开多大长度合适,因为我们需要用到的数组可能会根据情况变动。这时候我们就需要用到动态数组。所谓动态数组,也就是不定长数组,数组的长度是可以根据我们的需要动态改变的。动态数组的实现也不难,在 C++ 里面有已经写好的标准模板库(Standard Template Library),就是我们常说的 STL 库,实现了集合、映射表、栈、队列等数据结构和排序、查找等算法。我们可以很方便地调用标准库来减少我们的代码量。

C++ 中动态数组写作 vector ,C 语言中没有标准库,这也是为什么参加比赛推荐用 C++ 而不用 C 。

2.构造一个动态数组
C++ 构造一个 vector 的写法为: vector < T > vec 。这样我们定义了一个名字为 vec 的动态数组,其中 T 是我们数组要储存的数据类型,可以是 int 、 long long 、 double ,也可以是自己定义的结构体类型。初始的时候 vec 是空的。比如 vector<int> a 定义了一个储存整数的动态数组 a 。

3.常用函数

#include<iostream>
#include<vector> //引用头文件
using namespace std;
int main(){
    vector<int> vec;
    vec.push_back(a); //插入元素a(在数组末端进行)
    vec.size(); //获得长度
    vec[1] = a;
    for (int i = 0; i < vec.size(); i++) {
        cout << v[i] << endl;
    }  //遍历数组
    vec.pop_back(); //删除元素(在数组末端进行)
    vec.clear(); //清空vecotr, 但是并不清空内存
    return 0;
}

二、集合(set)

1.介绍
集合是数学中的一个基本概念,通俗地理解,集合是由一些不重复的数据组成的。比如一个有三个元素的集合。

2.构造一个集合
C++ 中直接构造一个 set 的语句为: set< T > s 。这样我们定义了一个名为 s 的、储存 T 类型数据的集合,其中 T 是集合要储存的数据类型。初始的时候 s 是空集合。比如 set< int > a , set< string > b等等。

3.常用函数

#include<iostream>
#include<set>
using namespace std;
int main(){
    set<int> a;
    a.insert(b); //插入元素b
    a.erase(c); //删除元素c,若不存在则不做任何操作
    a.count(b); //查找元素b,若存在返回true,否则返回false
    for (set<int>::iterator it = a.begin(); it != a.end(); it++) {
        cout << (*it) << endl; //迭代器遍历
    } //遍历元素(在 C++ 中遍历 set 是从小到大遍历的,也就是说 set 会帮我们排序)
    a.clear(); //清空 set 同时清空内存
    return0;
}

三.映射(map)

1.介绍
映射是指两个集合之间的元素的相互对应关系。通俗地说,就是一个元素对应另外一个元素。比如有一个姓名的集合 {"Tom", "Jone", "Mary"},班级集合 。姓名

与班级之间可以有如下的映射关系:("Tom") , ("Jone") ,("Mary"){1, 2}class = 1 class = 2 class = 1。我们称其中的姓名集合为 关键字集合(key),班级集合为 值集合(value)。在 C++ 中我们常用的映射是 map 。

2.构造一个映射
在 C++ 中,我们构造一个 map 的语句为: map<T1, T2> m; 。这样我们定义了一个名为 m 的从 T1 类型到 T2 类型的映射。初始的时候 m 是空映射。比如 map<string,int> m 构建了一个字符串到整数的映射,这样我们可以把一个字符串和一个整数关联起来。

3.常用函数

#include<iostream>
#include<map>
using namespace std;
int main(){
    map<string, int> dict;
    dict.insert(pair<string, int>("Tom", 1)); //插入一对映射
    dict["Tom"] = 2; //修改映射
    dict.count("Tom"); //查找关键字,如果建立过映射返回true,否则返回false
    for (map<string, int>::iterator it = dict.begin(); it != dict.end(); it++){ //迭代器遍历
        cout << (*it).first << " ‐> " << (*it).second << endl; // first 是关键字, second 是对应的值
    }
    dict.clear(); //清空映射及内存
    dict.size(); //获取映射对个数
    return 0;
}

暂时写这些,栈和队列抽空补上 

换了个编辑器感觉还不错

猜你喜欢

转载自blog.csdn.net/qq_43398760/article/details/83095975