- 0008:使用冒泡排序的方法
- 0011:利用递归倒序输出链表
- 0014:合并链表
- 0015:需要记住方法
- 0020
- 0022:还不懂
- 使用c++编码0015_复制复杂链表时,新建一个结点时要使用new这个关键字分配内存,new的具体用法?
- 0015本地通过,牛客oj没通过。还未查出原因。
- 0018本地测试同通过,牛客oj提示段错误。还未查出原因。
1.树的遍历
关于vector一些方法:
find找到某个元素的位置(迭代器),再使用distance。
vector<int>::iterator it = find(vin.begin(), vin.end(), root_val);
index_root = distance(vin.begin(), it);
vector<int>new_vector;
new_vector.assign(it_left,it_right);//it_left和it_right是已知vector [,)
//或者
vector<int>new_vector(it.begin(), it.begin()+1)
vector<string>res;
set<string>s(res.begin(), res.end());//利用set给res去重
res.assign(s.begin(), s.end());
v.erase(v.begin()+ixdex);
也可以删除范围内的元素。
可以使用make_pair或者初始化列表来生成一对pair
#include <utility>
#include <vector>
int main(){
vector<pair<int, int>>test;
test.push_back(make_pair(2,3));
}
#include <unordered_map>
#include <pair>
#include <vector>
int main(){
unordered_map<int, vector<pair<int, int>> >test;
test[1].push_back(make_pair(5,3));// []直接插入 有则直接接入向量
cout<<test[1][0].first<<" "<<test[1][0].second<<endl;
test[1].push_back(make_pair(4,3));
cout<<test[1][0].first<<" "<<test[1][0].second<<endl;
cout<<test[1][1].first<<" "<<test[1][1].second<<endl;
test[23].push_back(make_pair(10,5));
cout<<test[23][0].first<<" "<<test[23][0].second<<endl;
}
查看某个key是否存在:unordered_map<int, char>my_map; my_map[1] = 'a'; my_map.count(1);//1或者0
class Solution {
public:
// 将下面两个函数声明为静态成员函数
static bool f1(int currVal, int parentVal){
return currVal > parentVal;
}
static bool f2(int currVal, int parentVal){
return currVal < parentVal;
}
//函数指针作为参数
void heapAddElem(int ele, bool (*judge_f)(int, int)){
judeg_f(1, 2);
}
//在成员函数里调用heapAddElem
void cll_heapAddElem(){
heapAddElem(2, f1); //类内调用方法
heapAddElem(3, f2);
}
}
//类外调用
Solution test;
test.heapAddElem(5,&Solution::f1);
test.heapAddElem(5,&Solution::f2);//取静态成员函数地址
在类内部,定义一个compare成员函数,供sort使用,compare必须是静态:
class C{
public:
static bool compare(int a, int b){ return a>b;}
void f(vector<int>&v){
sort(v.begin(), b.end(), compare);
}
};
const char* resuChar = str.c_str();
to_string(2);
count(v.begin(),v.end(), 'a');
string st("adfadafdfdfdsfdfd");
string a = st.substr(1, 5); //从索引为1处复制5个[1,1+5) 第二个参数是要字串的长度
-
“123456”转123456:
#include <stdlib.h> #include <string> string s("123"); int a = atoi(s.c_str()); //1.atoi 参数要const char* 2. 先要把字符串变为c风格字符串
-
‘2’转2:
char a = '2'; int b = a - 0x30;
-
"12:23:34"分别得到“12”、“23”、“34”
#include <string> #include <sstream> string str = "12:34:56"; for (int i=0; i<str.length(); i++) { if (str[i] == ':') str[i] = ' '; } vector<int> array; stringstream ss(str); // 先转为字符串流 int temp; while (ss >> temp) // 读到空格算一个字符结束。读完返回结束符,-1. array.push_back(temp);
注意,使用
cin>>str;
如果输入“123 456 45”, str只会读入123,cin是以空格作为一个字符串结束的标志 -
字符串反转
string str string s(str.rbegin(), str.rend());
-
string转为c风格字符串char a []内
string str1; cin>>str1; char arr_cr[str1.size()]; memset(arr_cr, 0, sizeof(arr_cr)); //include <string.h> strcpy(arr_cr, str1.c_str()); //include <string.h>
-
c:
-
比较参数s1 和s2 字符串,比较时会自动忽略大小写的差异相同返回0
int strcasecmp (const char *s1, const char *s2);
//忽略大小写区别:
int strcmp(const char *str1, const char *str2)
-
sscanf()函数用于从字符串中读取指定格式的数据,其原型如下:
int sscanf (char *str, char * format [, argument, ...]);
-
scanf()
格式化输入:scanf("%d,%d,%d",&a,&b,&c);
键盘敲入必须带逗号 -
char cbuf[]={'a', 'b', 'c', 'd', 'e', '\0'}; char s[] = {'z', 'x', '\0'}; puts(cbuf); sprintf(cbuf, "%s", s); puts(cbuf); // print "zx"
-
inlcude<unistd.h> char **environ; //别的文件使用execve执行程序调用全局环境变量
-
//字符数组常用函数: strstr();//字串首次出现位置 strchr();//字符首次出现位置 strcat();//连接 index(); // 返回首次出现字符的地址
-
-
二维向量:
vector<vector<int> >v(rows, vector<int>(cols));
-
c++ 父类virtual方法,强制子类重写后调用,具体使用谁的方法,由对象类型决定。另外,此时子类对象想调用父类方法必须加上作用域。复杂情况如下:
calss BST<T>{ public: virtual insert(){ /*......*/ BST<T>::search(); } virtual search(){ // ...} }; calss Splay<T>:public BST<T>{ public: insert(){/*......*/} search(){ // ...} }; int main(){ Splay<int>splayTest; splayTest.insert(); //调用Splay的insert() splayTest.BST<int>::insert();// 如果BST中的insert里面对search()的调用没有使用作用域,实际将会调用Splay的search()方法,造成错误。本意是子类想调用父类的方法。 return 0; }