code_backup.note
创建一个m*n的二维vector
vector<int> col(n);
vector<vector<int> > res(m,col);
或者
vector<vector<int> > res(m,vector<int>(n));
vector<vector<int> > res(m,vector<int>(n,0));//初始赋值为0
vector<vector<int> > res(m,vector<int>(n,2));//初始全赋值为2
res[0][0]=1;
创建一个二维的vector并赋值
vector<int> temp;
vector<vector<int> > result;
int c = 100;
temp.push_back(c);
result.push_back(temp);
cout << result[0][0];//result[0]=temp;result[0][0]=temp[0]=100
vector<string> strs{ "flower" ,"flow" ,"flight" };//初始化赋值
vector<int> intnum{1,2,3 };
vector<int> intnum(4,3);//初始赋值intnum.size()=4,每个元素都为3
sort快速排序用法
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
bool great(int a, int b)
{
return a > b;
}
int main()
{
int a[8] = {1,3,2,4,7,6,5,9};
vector<int> temp{1,3,2,4,7,6,5,9};
sort(temp.begin(),temp.end());//默认从小到大排序,sort用在vector,默认 less<int>()
sort(a, a + 8, less<int>());//从小到大
sort(a, a + 8);//sort用在数组
sort(temp.begin(), temp.end(),great);//自定义从大到小排序函数great
sort(temp.begin(), temp.end(),greater<>());//系统从大到小排序函数greater
sort(a, a + 8,lesser);
for (auto i : a)
cout <<i << endl;
return 0;
}
断言函数assert,如果表达式值为假,则打印出错信息,然后终止程序运行
#include <assert.h>
int a = 1;
assert(a<0);//此时打印出错信息,然后终止程序运行
vector迭代器使用
#include <vector>
vector<int> vec;
for (vector<int>::iterator iter = vec.begin(); iter != vec.end(); ++iter)
{
cout << *iter <<endl;
}
for (auto iter = data.begin(); iter != data.end(); ++iter)
{
cout << *iter <<endl;
}
for(auto i:vec)
cout<<i<<endl;
partition函数,将整个数组分成满足条件的左边,和不满足条件的右边。
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool isodd(int i)
{
return i % 2 == 0;
//return i % 2 ==1;
}
int main()
{
vector<int> input;
int a[8] = { 1,3,2,4,7,6,5,9 };
for (int i = 0; i < 8; i++)
input.push_back(a[i]);
partition(input.begin(), input.end(), isodd);
for (auto i : input)
cout << i << " ";
return 0;
}
//cout:6 4 2 3 7 1 5 9
string,char [ ]与int转换
#include <string>
string str = "123";
int num = stoi(str);
string str1 = to_string(num);
char str[] = "123";
int num = stoi(str);
substr函数,s.substr(i,j)获得字符串中从第i位开始的长度为j的字符串
string s("12345asdf");
string a = s.substr(1,5); //获得字符串s中从第1位开始的长度为5的字符串
cout << a << endl;//cout:2345a
从string和vector删除字符,erase函数
**方法一:使用iterator和erase(删除it处的一个字符)**
string s="hello world";
int pos = s.find_last_of(' ');//s=5
s.erase(pos);//传入int型的参数,默认删除从5开始的所有元素, s=“hello”
string::iterator pos1 = s.begin()+pos;
s.erase(pos1);//传入迭代器型的参数,只删除该位置处的元素,s="helloworld"
for (string::iterator it = s.begin(); it != s.end(); ++it)
{
if (*it == ' ')
{
s.erase(it); //删除it处的一个字符
break;
}
}//s="helloworld"
s.erase(2,3);//删除从下标2开始的3个字符;s="he world"
s.erase(s.find('w'), 3);//删除从‘w’开始的3个字符;s="hello ld",s.find('w')返回下标3
**方法二:使用remove(删除[begin,end)之间的所有值等于'a'的值.)**
s.erase(remove(s.begin(), s.end(), 'e'), s.end());//删除[begin,end)之间的所有等于'e'的值,s="hllo world"
s.erase(remove(s.begin()+5, s.end(), ' '), s.end());//s="helloword"
s.erase(remove(s.begin() , s.begin()+3, 'e'),s.end());//s="hl"
s.erase(remove(s.begin() , s.begin()+3, 'e'), s.begin() + 3);//s="hllo word"
s.erase(remove(s.begin() , s.begin()+3, ' '), s.begin() + 3);//s="hello word"
删除所有末尾的空格:
string s = "hello world www ";
int pos = s.find_last_not_of(' ');
s.erase(remove(s.begin()+pos, s.end(), ' '), s.end());
对vector的erase完全一样:
vector<int> vec{122,22,39};//删除某个位置元素
vector<int>::iterator iter = vec.begin()+1;
vec.erase(iter);// vec{122,39}
//删除值为某个数的元素
for (vector<int>::iterator iter = vec.begin(); iter != vec.end(); iter++)
{
if (*iter == 22)
{
vec.erase(iter);break; // vec{122,39}
}
}
//删除[begin,end)之间的所有值等于22的值.)
vector<int> vec{122,22,39,22};
vec.erase(remove(vec.begin(), vec.end(), 22), vec.end()); // vec{122,39}
erase迭代器失效
问题,错误使用如下:
vector<int> nums{122,22,22,39};
for (vector<int>::iterator iter = nums.begin(); iter != nums.end();iter++)
{
if (*iter == 22) nums.erase(iter);
}
当执行了一次earse操作之后,原来用来遍历的iterator就失效了,其行为是不可预测的,具体情况由实现决定。同时earse操作会返回一个指向下一个元素的iterator,如果想继续遍历,就得用返回的iterator继续操作。
所以针对上面的代码,如果只是删除遍历时候碰到的第一个符合条件的元素,那么在earse之后添加break,使得不再进行遍历。如果要继续操作,那么就得改成,正确:
for (vector<int>::iterator iter = nums.begin(); iter != nums.end();)
{
if (*iter == 22)
iter=nums.erase(iter);
else
++iter;
}
或者
vector<int>::iterator iter = nums.begin();
while (iter != nums.end())
{
if (*iter == 22)
iter=nums.erase(iter);
else
iter++;
}
size、sizeof、strlen(最好不用sizeof)
对string或vector对象执行sizeof运算只返回该类型固定部分的大小(vector-16,string-28),不会计算对象中的元素占了多少空间。
对数组执行sizeof得到整个数组所占空间大小。
string res = "abcdef";
char s[] = "abcdef";
int a[] = {1,2,3};
cout << "size:" << res.size() << endl;
cout << "sizeof" << sizeof(res) << endl;
cout << "sizeof" << sizeof(s) << endl;
cout << "strlen" << strlen(s) << endl;
map用法
#include "stdafx.h"
#include <iostream>
#include <map>
using namespace std;
int main()
{
string str = "a00daaabbbsfg";
map<char, int> mp;
for (int i = 0; i<str.size(); ++i)
{
mp[str[i]]++;
}
for (map<char, int>::iterator iter = mp.begin(); iter != mp.end(); ++iter)
{
cout << iter->first << iter->second << endl;
}
cout <<mp.size()<<endl<< mp['a']<<endl;
return 0;
}
map<int, string> mapstudent;
//map插入元素的三种方式
mapstudent.insert(pair<int, string>(001, "stu1"));
mapstudent.insert(map<int, string>::value_type(001, "stu2"));
mapstudent[003] = "stu3";
//当map中有这个关键字时,insert操作是不能在插入数据的,但数组方式可以覆盖以前该关键字对应的值
// 查找元素,当所查找的关键key出现时,它返回数据所在对象的位置,如果沒有,返回iter与end函数的值相同。
map<int, string>::iterator iter = mapstudent.find(001);// iter=(1,"stu2")
//auto iter = mapstudent.find(006); //iter=end
if (iter != mapstudent.end())
cout << "Find, the value is " << iter->second << endl;
else
cout << "Do not Find" << endl;
// 刪除与清空元素
auto iter = mapstudent.find(001);
mapstudent.erase(iter);
int n = mapstudent.erase(001); //如果刪除了會返回1,否則返回0,n=1;
int n = mapstudent.erase(004); //n=0;
mapstudent.erase(mapstudent.begin(), mapstudent.end());//用迭代器范围刪除 : 把整个map清空,等同于mapstudent.clear();
unordered_set用法,set和map内部实现是基于RB-Tree,而unordered_set和unordered_map内部实现是基于哈希表(hashtable),无序集合容器(unordered_set)是一个存储唯一(unique,即无重复)的关联容器(Associative container).
#include <unordered_set>
unordered_set<char> lookup = { 'v','b','v','b','a' };//lookup={'v','b','a'};
lookup.insert('c');//lookup={'v','b','a','c'};
lookup.erase('b');//lookup={'v','a','c'};
lookup.empty();
lookup.sizee();
for (unordered_set<char>::iterator ite = lookup.begin(); ite != lookup.end(); ite++)
{
cout << *ite;
}
lookup.clear();
unordered_set<char>::iterator find_iter = lookup.find('b');
lookup.count('v');//'v'出现的次数1
C++数组或vector求最大值最小值
可以用max_element()及min_element()函数,二者返回的都是迭代器或指针。
#include<algorithm>
求数组的最大值或最小值以及最大值最小值对应的下标
1)vector容器
vector<int> v; //v={2,5,4,7,3}
int maxValue = *max_element(v.begin(),v.end()); //最大值 7
int minValue = *min_element(v.begin(),v.end()); //最小值 2
int maxPosition = max_element(v.begin(),v.end()) - v.begin(); //最大值下标 3
int minPosition = min_element(v.begin(),v.end()) - v.begin(); //最小值下标 0
int sizev = v.size(); //vector大小 5
2)普通数组
int a[]={1,2,3,4,5,6};
int maxValue = *max_element(a,a+6); //最大值 6
int minValue = *min_element(a,a+6); //最小值 1
int maxPosition = max_element(a,a+6) - a; //最大值下标 5
int minPosition = min_element(a,a+6) - a; //最小值下标 0
int sizea=sizeof(a) / sizeof(int); //求数组的大小 6
//注意:最值下标返回的是第一个最大(小)元素的位置。
find函数
1、string中find()返回值是字母在母串中的位置(下标记录),如果没找到,返回一个特别的标记npos(4294967295,返回值可以看成是一个int型的数)
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str1="abcde";
string str2="cdeab";
string str3 = str1 + str1;
int pos = str3.find(str2);// cout<<pos=2
string::size_type pos1= str3.find("aaa");//find函数返回类型size_type cout<<pos1=4294967295=npos
if (pos1 != string::npos) //if (pos1 != str3.npos)
cout << pos1 << endl;
else
cout << "not find!" << endl;
return 0;
}
//int pos = str3.find("aaa");// cout<<pos=-1,int型的pos可以和 string::npos比较判断if (pos != string::npos)
//auto pos1= str3.find("aaa");
//string::size_type pos1= str3.find(str2);//cout<<pos1=2 string::size_type类型的pos1可以和 string::npos比较判断
返回子串出现在母串中的首次出现的位置,和最后一次出现的位置。
auto position = str3.find_first_of('b'); //cout<<position=1
auto position1 = str3.find_last_of('b');//cout<<position1=6
返回子串出现在母串中的首次未出现的位置,和最后一次未出现的位置。
string str3 = "ab12";
auto position1 = str3.find_last_not_of('1'); //position1 =3
auto position1 = str3.find_last_not_of('2'); //position1 =2
auto position1 = str3.find_first_not_of('a'); //position1 =1
auto position1 = str3.find_first_not_of('v'); //position1 =0
查找某一给定位置后的子串的位置
auto position=str3.find("b",5);//从字符串str3下标5开始(包括5),查找字符串b,返回b在s中的下标 cout<<position=6
查找所有子串在母串中出现的位置
string::size_type pos;
pos = 0;
int i = 1;
while ((pos = str3.find("ab", pos)) != string::npos)
{
cout << "pos:" << i << ":" << pos << endl;
pos++; i++;
}
if(i==1)
cout << "not find";
return 0;
反向查找子串在母串中出现的位置,即字串在母串中最后出现的位置
pos = str3.rfind("a"); //cout<<pos=5
判断s是否是t的子序列
bool isSubsequence(string s, string t) {
int pos_s = 0;
for (int i = 0; i < t.size() && pos_s < s.size(); i++)
{
if (s[pos_s] == t[i])
pos_s++;
}
if (pos_s == s.size())
return true;
else
return false;
}
反转字符串函数 reverse
#include <algorithm>
string s = "hello";
reverse(s.begin(),s.end()); //s="olleh"
进制转换函数
**10进制转任意进制:**
自己实现代码(10进制转任意进制,结果为string):
string intToA(int n, int radix) //n是待转数字,radix是指定的进制
{
string ans = "";
do {
int t = n%radix;
if (t >= 0 && t <= 9) ans += t + '0';
else ans += t - 10 + 'a';
n /= radix;
} while (n != 0); //使用do{}while()以防止输入为0的情况
reverse(ans.begin(), ans.end());
return ans;
}
#include <algorithm>
int num = 10;
string str = intToA(num, 2);//str=1010;
itoa函数:将一个10进制的数(value)转化为radix进制(2-36)的值、其返回值为char型。
函数原型:char*itoa(int value,char*string,int radix);
#include<cstdlib>
int main()
{
int num = 10;
char str[100]="";
_itoa_s(num, str, 2);//将十进制数num转换为2进制数存到str里面。str=1010
_itoa_s(num, str, 8);
return 0;
}
**任意进制转10进制**
自己实现代码
int Atoi(string s, int radix) //s是给定的radix进制字符串,返回10进制数
{
int ans = 0;
for (int i = 0; i<s.size(); i++)
{
char t = s[i];
if (t >= '0'&&t <= '9') ans = ans*radix + t - '0';
else ans = ans*radix + t - 'a' + 10;
}
return ans;
}
string str = "1010";
int num = Atoi(str, 2);//把2进制的1010转为10进制,num=10
strtol()函数, base是要转化的数的进制,非法字符会赋值给endptr,nptr是要转化的字符
函数原型:long int strtol(const char *nptr, char **endptr, int base)
char buffer[20] = "10549stend#12";
char *stop;
int ans = strtol(buffer, &stop, 8);//将八进制数1054转成十进制ans,后面9stend#12均为非法字符 ans=556,stop=9stend#12
char buffer[20] = "1010101";
char *stop;
int ans= strtol(buffer, &stop, 2);//将2进制数1010101转为10进制数ans,ans=85,stop=""
c++ stl栈stack,先进后出
头文件为:
#include <stack>
empty() 堆栈为空则返回真
pop() 移除栈顶元素
push() 在栈顶增加元素
size() 返回栈中元素数目
top() 返回栈顶元素
新建一个ListNode,在节点pnode后面新加一个节点
ListNode* t=new ListNode(1);//初始化节点的值为1
pnode->next=t;
pnode=pnode->next;
int n=-2147483648;
long absn=-1*(long)n;
或
long absn=n;absn=-absn;
编程实现从string中提取所有的数字
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <stdio.h>
#include <string>
using namespace std;
int main()
{
string str;
cin >> str;
int num_temp = 0;
bool isdig = false;
vector<int> num;
int sign = 1;
for (int i = 0; i < str.size(); ++i)
{
if (str[i] == '-' && isdigit(str[i + 1]))
{
sign = -1;
continue;
}
if (isdigit(str[i]))
{
num_temp = num_temp * 10 + (str[i]-'0');
isdig = true;
}
else
{
if (isdig)
{
num.push_back(num_temp*sign);
isdig = false;
num_temp = 0;
sign = 1;
}
}
}
if(num_temp!=0)
num.push_back(num_temp);
return 0;
}
int myAtoi(string str) {
int i=0;//位置
long res=0;
int sign=1;//符号
while(i<str.size() && str[i]==' ') ++i;//找到第一个非空格的字符位置
if(i == str.size()) return 0;
if(str[i]=='-') {sign=-1;i++;}
else if(str[i]=='+') i++;
while(i<str.size() && isdigit(str[i]))
{
res=res*10+(str[i++]-'0');
if(res>INT_MAX){
if(sign==1) return INT_MAX;
else return INT_MIN;
}
}
return res*sign;
}