字符串
vector
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
void printVector(vector<int>&v){
for(vector<int>::iterator it = v.begin();it != v.end();it++){
cout << *it << " ";
}
cout << endl;
}
void test01(){
vector<int>v1;
for(int i=0; i<10; i++){
v1.push_back(i);
}
printVector(v1);
//尾删
v1.pop_back();
printVector(v1);
//插入
v1.insert(v1.begin(), 2, 100); //插2个100在集合的前面
printVector(v1);
v1.insert(v1.begin()+2, 111); //指定位置插入
printVector(v1);
//删除
v1.erase(v1.begin());//删除第一个位置的数
printVector(v1);
//清空
v1.clear();
}
int main(){
test01();
return 0;
}
内置函数
#include <bits/stdc++.h>
#include <string>
using namespace std;
int main(){
int a[10] = {0,1,2,3,4,5,6,7,8,9};
// 翻转
reverse(a,a+10);
for(int i = 0 ; i < 10; i++){
printf("%d ",a[i]);
}
printf("\n");
// 最大值 最小值比较
int n1 = max(1,9),n2 = min(1,9);
// 交换内容
int num1 = 5, num2 = 10;
swap(num1,num2);
printf("num1 = %d, num2 = %d\n",num1,num2);
// 计数
int cnt = count(a,a+10,0);
// 把字符串全部变为大写 或小写
string str = "ABC";
transform(str.begin(),str.end(),str.begin(),::toupper);
transform(str.begin(),str.end(),str.begin(),::tolower);
printf("%d\n",cnt);
// find函数
int a[3] = {1,2,3};
int *pos = find(a,a+3,0);
cout <<pos-a; // 找不到,输出最后一个元素的下标+1
*pos = find(a,a+3,1);
cout <<pos-a; // 输出 0
// 找到在输出位置
set<int> st;
st.insert(1);
st.insert(2);
set<int>::iterator it;
it = st.find(3);
if(it == st.end()){
printf("Not found!\n");
}
vector<int>vt;
vt.push_back(1);
vt.push_back(2);
vt.push_back(3);
if(find(vt.begin(),vt.end(),4) == vt.end()){
printf("Not found!\n");
}
cout << *find(vt.begin(),vt.end(),2) << endl; // 输出2
int a[3] = {1,2,3};
int *pos = find(a,a+3,4);
cout << *pos << endl; //输出0
pos = find(a,a+3,1);
cout << *pos << endl; //输出1
// 判断是否是数字,字母,大写,小写,如果是返回值非0,否返回值0
//isdigit();
//isalpha();
//islower();
//isupper();
return 0;
}
胡伟平老师的笔记
STL作为竞赛神器,可以方便进行程序设计,主要有以下几个:
一、数据结构:vector, set, map, stack, queue.
1) vector 容器,最常用的数据类型,等价于可变长度数组。
定义方法 vector<int> v;
常用的函数 v.size()——求v里元素个数 v.empty()——v是否为空
v.push_back(x)——在v的最后增加元素x
v.clear()——清空
v.pop_back()——删除v的最后一个元素
元素引用方法和数组一样,v[i]访问第i个元素
2)set 集合,最大的优点是自动去重,自动排序
定义方法 set<int> s;
常用的函数 s.size()——求s里元素个数 s.empty()——s是否为空
s.insert(x)——在s中插入元素x
s.erase(x)——在s中删除元素x
s.clear()——清空
s.count(x)——返回值0或者1,判断x是否在s中
遍历的话需要使用iterator指针,用法如下
set<int> s;
set<int>::iterator iter;
for(iter = s.begin(); iter != s.end(); iter ++)
cout << *iter;
3)map 映射,最大的优点是可以使用较小的数据存储范围很广的数据,和哈希函数的功能一样
定义方法 map<string, int> m;
常用的函数 m.size()——求m里元素个数 m.empty()——m是否为空
m["ABC"] = 1 ——在m中插入元素, 可以把前面那个当作下标来看
m.clear()——清空
m.count("ABC")——返回值0或者1,判断"ABC"是否在m中
遍历的话需要使用iterator指针,用法如下
map<string, int> m;
map<string, int>::iterator iter;
for(iter = m.begin(); iter != m.end(); iter ++)
cout << iter->first << iter->second;
iter->first和iter->second分别是下标和值
4)stack 栈。 和数据结构的栈一样,只不过不用实现,可以直接使用
定义方法 stack< int> s;
常用的函数 s.size()——求s里元素个数 s.empty()——s是否为空
s.push(x) ——x入栈
s.pop()——出栈
x = s.top()——取栈顶元素
5)queue 队列。 同上
定义方法 queue< int> s;
常用的函数 q.size()——求q里元素个数 q.empty()——q是否为空
q.push(x) ——x入队
q.pop()——出队
x = q.front()——取队头元素
二、常见函数的使用
1)sort 排序
一般对数组和vector排序,速度非常快。
默认从小到大 int a[100]; vector<int> v;
sort(a, a + 100); sort(v.begin(), v.end());
如果要从大到小,那么
sort(a, a + 100, greater<>()); sort(v.begin(), v.end(), greater<>());
自定义排序,需要自己写排序函数
比如一个学生信息,按姓名字典序排序,姓名相同的按学号升序,那么
struct node
{
int stuNo;
string name;
};
bool cmp(struct node a, struct node b)
{
if(a.name != b.name)
return a.name < b.name;
else
return a.stuNo < b.stuNo;
}
vector<struct node> v;
sort(v.begin(), v.end(), cmp);
2) find函数, 使用的分治查找技术, 速度快
find(first, end, value);
返回区间[first,end)中第一个值等于value的元素位置;若未找到,返回end。函数返回的是迭代器
vector<int> v;
vector<int>::iterator pos;
pos = find(v.begin(), v.end(), 5); 在v中查找5
if(pos != v.end())
cout << *pos;
else
cout << "Not found!";
3) low_bound()函数 非常强悍的查找函数,时间复杂度低
int a[1000];
int t=lower_bound(a+left,a+right,m)-a; // 返回值是指针,减去数组首地址,得到下标
使用前提,a已经按升序排好,查找[left,right)区间内的值为m的元素。返回m在数组中的下标。
如果m在区间中没有出现过,那么返回第一个比m大的数的下标。(非常有用!)如果m比所有区间内的数都大,那么返回right。这个时候会越界,小心。如果区间内有多个相同的m,返回第一个m的下标。
当然,也可以在vector里使用
pos = lower_bound(v.begin(), v.end(), 5); //pos是一个vector<int>::iterator类型