C++的输入与输出 头文件为,一般用cout流输出、cin流输入,他们都在标准名称空间std内,所以要加上using namespace std。
1 2 3 4 5 6 7 8 #include <iostream> using namespace std;int main () { cout << "HelloWorld!" << endl; return 0 ; }
用cin输入,cout输出的样例:
1 2 3 4 5 6 7 8 9 10 #include <iostream> using namespace std;int main () { int a; cin >> a; cout << "You input a number a = " << a << endl; return 0 ; }
C++ 类 对象 类和C语言的结构体很像,只是多了public和private的字段(还有protect等,但在数据结构中不怎么用到),里面的函数、变量都叫做成员。
这样定义一个类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 class Student {private : int id; string name; public : Student (); Student (int id, string name); ~Student (); void printStudent () ; void setID (int id) ; void setName (string name) ; int getID () ; int getName () ; } Student::Student (){ this ->id = -1 ; this ->name = "" ; } Student::Student (int id, string name){ this ->id = id; this ->name = name; } Student::~Student (){ } void Student::printStudent () { cout << "Name: " << this ->name << endl; cout << "ID: " << this ->id << endl; } void Student::setID (int id) { this ->id = id; } void Student::setName (string name) { this ->name = name; } int Student::getID () { return this ->id; } int Student::getName () { return this ->name; }
在主函数中一般这样创建类的对象:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 int main () { Student stu1; cout << stu1.id << " " << stu1.name << endl; cout << stu1.getID () << " " << stu1.getName () << endl; Student stu2 (123 , "Jack" ) ; cout << stu1.getID () << " " << stu1.getName () << endl; return 0 ; }
string字符串 string是一种类,里面集成了字符串的各种用法。
使用string可以基本上抛弃char了。string是字符串,其基本用法与char大同小异
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 using namespace std; ... string name; name = "Jack" ; cout << name.size (); string id = "1234" ; cout << name + id << endl; cout << id + name << endl; string tmp = name + id; if ("abc" > "BDF" ) cout << "true" ;if ("abcd" > "accd" ) cout << "true" ;string str; string arr[10 ]; for (int i = 0 ; i < str.size (); i++){ cout << str[i]; }
vector动态数组 C++中使用new关键字创建动态数组,但并不是真正的动态。我们不能随意进行长度的变更。可以考虑std中的vector类,它是一个动态数组,操作起来非常方便,而且不需要我们进行析构。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 int main () { vector<int > arr; arr.push_back (0 ); arr.push_back (1 ); arr.push_back (2 ); cout << arr.size () << endl; vector<int > brr (10 ) ; vector<int > crr (10 , -1 ) ; int n = 3 , m = 4 ; vector<vector<int >> mat (n, vector <int >(m)); }
unordered_set 乱序集合 可以定义一个集合,集合中元素具有唯一性
sort函数 sort函数基于快速排序,只要给定数组的首尾,就可以获得有序的序列
1 2 3 4 5 6 7 8 9 10 11 int main () { int arr[10 ]; sort (arr, arr+10 ); vector<int > brr; sort (brr.begin (), brr.end ()); }
默认为升序,如果要使用降序排序,就得手写比较器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 bool cmp (int a, int b) { return a > b; } int main () { int arr[10 ]; sort (arr, arr+10 , cmp); vector<int > brr; sort (brr.begin (), brr.end (), cmp); }
可以使用lambda匿名函数的技巧,将cmp“内嵌”到sort里:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 int main () { int arr[10 ]; sort (arr, arr+10 , [](int a, int b) -> bool { return a > b; }); vector<int > brr; sort (brr.begin (), brr.end (), [](int a, int b){ return a > b; }); }
sort函数可以基于结构体或者类排序,比如要按照Student结构体中的age从大到小排序:
1 2 3 4 5 6 7 8 9 10 11 12 struct Student { string name; int age; }; int main () { Student stu[10 ]; sort (stu, stu+10 , [](Student a, Student b){ return a.age > b.age; }); }
也可以按照如下规则排序:如果age不相等,按照age从大到小,如果age相等,按照name的字典序从大到小排序:
1 2 3 4 5 6 7 8 9 10 11 12 13 struct Student { string name; int age; }; int main () { Student stu[10 ]; sort (stu, stu+10 , [](Student a, Student b){ if (a.age == b.age) return a.name > b.name; return a.age > b.age; }); }