刷题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)
已有键值对,值+1myMap[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>());
  • 21
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值