c++ 笔记

字符串

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0lDVDM0NQ==,size_16,color_FFFFFF,t_70

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类型

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值