c++刷题笔记
一、数组
长度
size();
二、字符串
1.长度
length();
2.tips:使用双引号(字符型使用单引号)
3.substr()
substr,主要功能是复制子字符串,要求从指定位置开始,并具有指定的长度。
b=a.substr(0,a.length()-1);
4.(以空格)切割字符
没有直接的split函数
int j = i;
while (j < m && str[j] != ' ') j++;
string tmp = str.substr(i, j - i);
5.append()
在字符串的末尾添加字符或字符串
string s1="hello";
string s2= "world";
s1.append(s2);
6.参数中string和string&和string*的区别
想在函数内部修改字符串,并且希望这些修改影响到原始字符串,你应该使用string&或string*。
如果不想在函数内部修改原始字符串,你应该使用string
三.vector
vector 是一个动态数组
vector<string>
表示一个由字符串组成的动态数组
- 若是有int,则默认将int型转变为string型插入,若是既有int型又有字符串型,则必须显性将int型转变为string型
to_string(num[i])
,否则会报错
//定义具有10个整型元素的变量,且给其中的每个元素初值为1
vector<int> v(10,1);
定义一个字符串容器里面的元素都是字符串:vector<vector<string>>
e.g.[[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]
函数名称 | 接口说明 |
---|---|
push_back() | 尾插 v.push_back(3); |
pop_back() | 尾删v.pop_back(); |
find() | 查找(注意这个是算法模块实现,不是vector的成员接口) |
insert() | 在position之前插入valvec.insert(2, 40);//在第二个位置插入一个40 |
erase() | 删除position位置的数据vec.erase(vec.begin() + 2); // 删除第三个元素 |
swap() | 交换两个vector的数据空间vector<int> vec1 = { 10, 20, 30 }; vector<int> vec2 = { 40, 50, 60 }; vec1.swap(vec2); |
operator() | 像数组一样访问 下标随机访问 |
sort() | 排序sort(po.begin(),po.end()); |
size() | 长度(在循环中多次调用size()函数可能会导致不必要的性能开销。最好将size()的结果存储在一个变量中,并在循环中使用该变量。) |
back() | back()函数用于返回vector中的最后一个元素的引用。通常用于获取vector中的最后一个元素或者修改最后一个元素的值。 |
去重-使用sort+unique
// 对vector进行排序
sort(v.begin(), v.end());
// 使用unique去除重复元素,返回新的结尾迭代器
auto end_unique = unique(v.begin(), v.end());
// 使用erase方法去除重复元素后的元素
v.erase(end_unique, v.end());
auto
auto end_unique = unique(v.begin(), v.end());(上文)
auto关键字能够自动识别变量类型。
使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。
auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。
- vector在还没有分配任何空间时还不能像数组一样用下标形式去访问vector的(v[0]也不行)!!!
unordered_map<string, vector<string>> mp;
vector<vector<string>> ans;
for (auto it = mp.begin(); it != mp.end(); ++it) {//不知道指针什么类型可以用auto
ans.emplace_back(it->second);
}
四.哈希表-hash_map
map
map提供一个很常用的功能,那就是提供key-value的存储和查找功能。
map<string, string> namemap;
namemap["岳不群"]="华山派掌门人,人称君子剑";
namemap["张三丰"]="武当掌门人,太极拳创始人";
namemap["东方不败"]="第一高手,葵花宝典";
...
//查找。。
if(namemap.find("岳不群") != namemap.end()){
...
}
函数名称 | 接口说明 |
---|---|
count() | 返回键K在Map容器中的出现次数。如果 key 存在,则返回1,因为映射仅包含唯一 key 。如果键不存在,则返回0。 map_name.count(key k) |
已有键值对,值+1 | myMap[key] += 1; 使用下标操作符,如果键不存在,它会插入键并将值初始化为0 |
取值 | at-会做下标检测[]:不存在会插入 |
empty() | 检查是否为空 |
swap() | 交换 |
find() | 关键字查询,找到则返回指向该关键字的迭代器,否则返回指向end的迭代器 |
遍历 | for (const auto& pair : myMap) {cout << pair.first<<" " << pair.second <<endl;} |
push_back | 是先检查是否有数据,然后再插入数据。 |
emplace_back | 是直接插入end 的mp.emplace_back(str) |
- emplace_back和push back的区别
emplace_back:直接在容器尾部构造新元素,避免了临时对象的创建和拷贝,通常比push_back更高效。
push_back:先将元素拷贝或移动到容器中,可能涉及多次构造函数调用,效率较低。
hash_map
使用一个下标范围比较大的数组来存储元素。可以设计一个函数(哈希函数,也叫做散列函数),使得每个元素的关键字都与一个函数值(即数组下标,hash值)相对应,于是用这个数组单元来存储这个元素。
- 哈希表存储数组中所有的数需要 O(n) 的空间。
- 查看一个数是否存在,能优化至 O(1) 的时间复杂度。
hash_map<int, string> mymap;
mymap[9527]="唐伯虎点秋香";
mymap[1000000]="百万富翁的生活";
mymap[10000]="白领的工资底线";
...
if(mymap.find(10000) != mymap.end()){
...
}
五、set容器
set 容器内的元素会被自动排序。
set 中不能有两个元素有相同的key值。
不能通过 set 的迭代器去修改 set 元素,原因是修改元素会破坏 set 组织。
定义:
set<int> a; //定义一个int类型的集合a
set<int> b(a.begin(), a.end()); //定义集合b,将集合a中的所有元素作为集合b的初始值
int n[] = { 1, 2, 3, 4, 5 };
set<int> a(n, n + 5); // 定义集合a,用数组n的前5个元素作为集合a的初值
操作
函数名称 | 接口说明 |
---|---|
count() | 查找key的元素个数 |
empty() | 判空 |
insert() | 插入st.insert(4); |
empty() | 检查是否为空 |
erase() | 删除 |
find() | 关键字查询,找到则返回指向该关键字的迭代器,否则返回指向end的迭代器 |
遍历 | for (it = st.begin(); it != st.end(); it++)cout << *it << " "; cout << endl; |
swap() | 交换两个容器中的元素st1.swap(st2); |
迭代器
迭代器名称 | 说明 |
---|---|
begin() | 开始迭代器指针: |
end() | 末尾迭代器指针: 指向最后一个元素的下一个位置 |
rbegin() | 反向迭代器指针,指向最后一个元素 |
rend() | 反向迭代器指针,指向第一个元素的前一个元素 |
cbegin() | 指向常量的开始迭代器指针: 意思就是不能通过这个指针来修改所指的内容,但还是可以通过其他方式修改的,而且指针也是可以移动的。 |
cend() | 指向常量的末尾迭代器指针 |
函数
isalnum函数-判断是否是字母或数字
isalnum函数是用来判断是否是字母或数字的函数
int isalnum(int c);
c是需要判断的字符;返回值为0表示不是字母或数字。
if (isalnum(ch))
tolower函数-大写字母转换为小写
把字母字符转换成小写,非字母字符不做出处理。
反之,小写转大写-toupper
sort函数
sort函数仅支持可随机访问的容器,如数组, string、vector、deque等
默认升序排序
sort(arr.begin(), arr.end());
降序排序:greater()。可int、float、double、long
sort(arr.begin(), arr.end(), greater<int>());