C++容器

关于初学C++容器的的一些方法的简单记录

容器的初始化与索引数据类型:

vector初始化

1
2
3
4
vector<int> my_vec{1,2,3};
vector<int> my_vec(10,5);// 初始化10个5
vector<int> my_vec(10); // 初始化10个位置
vector<int>my_sec{my_vec.begin()+2,my_vec.end()-1}; //通过my_vec进行初始化[2:-1)

map初始化

1
2
map<string, int> my_map{{ , } , { , }}; //map 存储pair 类型作为元素
// map 与python类似 my_map【】 索引可添加元素

数据类型

对于容器的索引,例如vec[index]. index 是unsign类型,类型名字是size_t,当与int类型进行比较,以及运算是容易出错

1
2
3
4
5
 vector<int> ans(10,5);
vector<int> my_v{ans.begin()+2,ans.end()-5};

//会报错no matching function for call to 'min' auto anss = min(5,ans.size()); ans.size()不是int类型 转化为int 才能比较。
auto anss = min(5,ans.size());

容器的增删改查加排序

添加元素

添加数据可以通过容器自带的类似于push_back(), insert()方法;或者inserter() 这样的泛型函数;

1
2
3
4
vector<int> vec{1,2,3,4};
auto it = vec.insert(vec.begin()+1, 10); // 返回的it 是插入位置(10 所在的位置)的迭代器, 在第一个参数(迭代器)前面插入后面参数的内容
it = vec.insert(vec.end(), 3, 4); //插入通过构造函数调用后两个参数的返回值(3个4)插入到vec 末尾
it = vec.insert(vec.end(),vec2.begin(), vec2.end()); // 将vec2插入到vec1里, 类似python 里面的extend

删除元素

1
2
3

vector<int>::iterator it_1;
auto it = vec.erase(it_1); //删除迭代器所指的元素,返回删除元素位置后一位的迭代器。

修改

可以通过迭代器的解引用*it 进行索引和修改 也可以是下标索引,map索引的时候可能会添加心的pair

查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//  对于string vec 调用自己的find 方法

auto it = vec.find(target_val, start_index, end_index); // 从索引范围内查找第一个元素 返回元素所在index 若不在则返回比长度大得多的整数

// find_first_of , find_last_of声明如下
size_t find_last_of (const string& str, size_t pos = npos) const noexcept;
size_t find_last_of (const char* s, size_t pos = npos) const;
size_t find_last_of (const char* s, size_t pos, size_t n) const;
size_t find_last_of (char c, size_t pos = npos) const noexcept;

// 对于vector 没有find 方法 需要调用 泛型函数 find

auto it = find(vec.begin(), vec.end(), target_val); // 输入输出均为迭代器;与string index不同

// 对于map 查找可以用find 返回值是key 也可以用count 返回true false;

容器最大值最小值的索引

通过返回最大或者最小值的迭代器,然后与begin()迭代器做差得到

1
2
3
vector<int> v(10);
auto it = max_element(v.begin(),v.end());
int index = it-v.begin();

排序

泛型函数sort(it.begin(), it.end(),my_sort);

1
2
3
4
5
6
sort(numbers.begin(),numbers.end(),my_sort);

static bool my_sort(int A, intB){
return A<B;//A靠前
}
my_sort函数为成员函数时(成员函数默认第一个参数是*this) 需要加static 作为一般函数(没有this参数)是不需要

容器的泛型函数

反转

1
2
3
4
vector<int> arrayRever{1,2,3,4};
reverse(arrayRever.begin(),arrayRever.end()); //没有返回值 就地反转

vector<int> vec (arrayRever.rbegin(), arrayRever.rend()); // 初始化反转