一、vector的 back()和pop_back
c.back()返回向量容器的最后一个元素
c.pop_back 弹出向量容器的最后一个元素
while(c.back()==0)
{
c.pop_back();
}
二、引用
1.当一个函数需要返回多个变量的值且不使用全局变量的情况下,可以通过引用来实现
如
vector<int> div(vector<int > &a,vector<int > &b,int &r)
函数类型 返回一个vector
余数 r 通过引用的方式返回
- 引用可以减少数组容器拷贝的过程,提高效率。
当一个函数的形参是数组或向量时候,不写引用,实际是将使用的数组拷贝给形参数组,使用引用,则可以不拷贝。
三、stack 数组
许久没用栈了,很多时候都想不到用栈,这里利用删除字符这道题来复习一下栈和栈数组的使用
#include<bits/stdc++.h>
using namespace std;
int n, k;
string s;
stack <int> e[26];
bool vis[100005];
int main() {
cin >> n >> k >> s;
int len = s.length();
for (int i = len - 1; i >= 0; i--) {
e[s[i] - 'a'].push(i);
}
int t = 0;
for (int i = 1; i <= k; i++) {
while (e[t].size() == 0)
t++;
vis[e[t].top()] = true;
e[t].pop();
}
for (int i = 0; i < len; i++) {
if (!vis[i]) cout << s[i];
}
system("PAUSE");
return 0;
}
stack<int > e[26], 一个栈数组
e[s[i]-'a'].push(i);
栈数组的操作
四、字符串的‘+’操作
string s="";
for(...)
{
s+=a[i];
}
将 a[i]逐个排在字符串s的后面
五、string 从第一个字符开始输入
string s;
cin>>s+1;
这样操作是错误的。 string是C++固定的STL 只能从s[0] 开始读入
六、string的赋值 适用于多个相同字符
string str6 = string(10,'h'); // str6 = "hhhhhhhhhh"
int n;
cin >> n;
for (int i = 1; i <= n; ++i) {
string space = string(n - i, ' ');
string ch = string(2 * i - 1, 'A' + i - 1);
cout << space + ch << endl;
}
cout 计算过程中结果自动转换成整数
for (int j = i - 1; j >= 1; j--) {
cout << (char)('1' + j - 1);
}
当计算和ASCLL 码相关的时候,用cout输出时,应加强制转换
七、 闰年计算
1、 能被400 整除的年份是闰年
2、不能被100整除 但是能被4整除的年份是闰年
int is_leap_year(int year) {
if (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0)) {
return 1;
}
return 0;
}
八、string 中的find();函数
两个参数 第二个可以省略
省略第二个参数 则从0位置开始找
返回值为 第一次找到字符或者字符串的位置(注意,第一个参数既可以是字符,也可以是字符串)。
如果找不到则返回npos npos在C++中定义为-1 可以直接和-1比较
string st1("babbabab");
cout << st1.find('a') << endl;//1 由原型知,若省略第2个参数,则默认从位置0(即第1个字符)起开始查找
cout << st1.find('a', 2) << endl;//4 在st1中,从位置2(b,包括位置2)开始,查找字符a,返回首次匹配的位置,若匹配失败
#include<bits/stdc++.h>
using namespace std;
int main()
{
string st1("babbabab");
cout << st1.find('a') << endl;
cout << st1.find('a', 2) << endl;
cout << st1.find('c') << endl;
if (st1.find('c') == -1)
cout << "yes" << endl;
int ans = st1.find('c');
cout << ans << endl;
return 0;
}
九、unique 和erase 实现去重
现在总结一下unique,unique的作用是“去掉”容器中相邻元素的重复元素(不一定要求数组有序),它会把重复的元素添加到容器末尾(所以数组大小并没有改变),而返回值是去重之后的尾地址。
a.erase(unique(a.begin(),a.end()),a.end());
先unique去重 ,unique函数返回去重后的位置,重复的元素在这个位置之后排列着
然后在用 这个位置 和数组的末尾作为erase的两个参数 将尾巴减去,就实现了去重
十、C++中迭代器
vector<int>::iterator iter; //定义一个名为iter的变量
vector<int> ivec;
vector<int>::iterator iter1=ivec.bengin(); //将迭代器iter1初始化为指向ivec容器的第一个元素
vector<int>::iterator iter2=ivec.end(); //将迭代器iter2初始化为指向ivec容器的最后一个元素的下一个位置
*iter //对iter进行解引用,返回迭代器iter指向的元素的引用
iter->men //对iter进行解引用,获取指定元素中名为men的成员。等效于(*iter).men
++iter //给iter加1,使其指向容器的下一个元素