g++编译

g++ Helloworld.cpp -o Hello/g++ Helloworld.cpp

位运算符


// 位与 两个位都为1时,结果才为1
&

// 位或 两个位都为0时,结果才为0
|

// 位异或 两个位相同位0,相异为1
^

// 位取反 0变1,1变0
~

// 二进制左移,各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。
<<

// 二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。
>>

标准输入输出

//c风格
#include <stdio.h>
int main( ) {
 
   char str[100];
   int i;
 
   printf( "Enter a value :");
   //在读取字符串时,只要遇到一个空格,scanf() 就会停止读取,所以 "this is test" 对 scanf() 来说是三个字符串。
   scanf("%s %d", str, &i);
 
   printf( "\nYou entered: %s %d ", str, i);
   printf("\n");
   return 0;
}

//c++输出输出流
#include <iostream>

using namespace std;

int main( ){
   char name[50];
 
   cout << "请输入您的名称: ";
   cin >> name;
   cout << "您的名称是: " << name << endl;
 
}

结构体

struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book;

//为了访问结构的成员,我们使用成员访问运算符(.)
int main( )
{
   Books Book1;        // 定义结构体类型 Books 的变量 Book1
   Books Book2;        // 定义结构体类型 Books 的变量 Book2
 
   // Book1 详述
   strcpy( Book1.title, "C++ 教程");
   strcpy( Book1.author, "Runoob"); 
   strcpy( Book1.subject, "编程语言");
   Book1.book_id = 12345;
 
   // Book2 详述
   strcpy( Book2.title, "CSS 教程");
   strcpy( Book2.author, "Runoob");
   strcpy( Book2.subject, "前端技术");
   Book2.book_id = 12346;
 
   // 输出 Book1 信息
   cout << "第一本书标题 : " << Book1.title <<endl;
   cout << "第一本书作者 : " << Book1.author <<endl;
   cout << "第一本书类目 : " << Book1.subject <<endl;
   cout << "第一本书 ID : " << Book1.book_id <<endl;
 
   // 输出 Book2 信息
   cout << "第二本书标题 : " << Book2.title <<endl;
   cout << "第二本书作者 : " << Book2.author <<endl;
   cout << "第二本书类目 : " << Book2.subject <<endl;
   cout << "第二本书 ID : " << Book2.book_id <<endl;
 
   return 0;
}

//指向结构体的指
struct Books *struct_pointer;
//结构变量的地址
struct_pointer = &Book1;
//指向该结构的指针访问结构的成员,需要使用->运算符
struct_pointer->title;

数据类型

char 1字节 -128~127 或 0~255
int 4字节
short int 2字节
float 4字节
double 8字节

//等价于null, c++11
nullptr

//转换为string型, c++17
to_string()

auto 存储类

auto f=3.14;      //double
auto s("hello");  //const char*
auto z = new auto(9); // int*
auto x1 = 5, x2 = 5.0, x3='r';//错误,必须是初始化为同一类型

//decltype 类型推导
int i = 4;
decltype(i) a; //推导结果为int。a的类型为int。

极大值,极小值的初始化

min = INT_MIN;
max = INT_MAX;

print

printf("ASCII value = %d, Character = %c\n", ch , ch );

数组

double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};

字符串操作

//字符串生成
string s("1a2b3c4d5e6f7g8h9i1a2b3c4d5e6f7g8ha9i");
string::size_type position;


//find 函数 返回jk 在s 中的下标位置 
position = s.find("jk");
//如果没找到,返回一个特别的标志c++中用npos表示
if (position != s.npos){
	cout << "position is : " << position << endl;
}else{
	cout << "Not found the flag" + flag;
}

//字符串结束符号
\0

//atoi字符串转换成整型数的
using namespace std;

int main(){  
    string str ="123";
    //.c_str()函数返回一个指向正规C字符串的指针常量, 内容与本string串相同
    int num = atoi(str.c_str());
    cout<<num<<endl;
    getchar();
    return 0;
}

运算符重载

// 重载 + 运算符,用于把两个 Box 对象相加
Box operator+(const Box& b)
{
	Box box;
	box.length = this->length + b.length;
	box.breadth = this->breadth + b.breadth;
	box.height = this->height + b.height;
	return box;
}

STL的vector用法

// 导入
#include <vector>

//get vector size
nums.size()

//init
//声明一个int型向量a
vector<int> a ;
//声明一个初始大小为10的向量
vector<int> a(10) ;
//声明一个初始大小为10且初始值都为1的向量
vector<int> a(10, 1) ;
//声明二维数组, 并初始化
vector<vector<int>> a(n, vector<int>(n, 0));
//声明并用向量a初始化向量b
vector<int> b(a) ;
//将a向量中从第0个到第2个(共3个)作为向量b的初始值
vector<int> b(a.begin(), a.begin()+3) ;

//对其中部分元素进行输入
cin >>a[2];
cin >>a[5];
cin >>a[6];

//返回空的vector
return {};

//全部输出
int i ;
for(i=0; i<a.size(); i++) cout<<a[i]<<" " ;

//遍历器
//全部输出
vector<int>::iterator t ;
for(t=a.begin(); t!=a.end(); t++)
    cout<<*t<<" " ;

//begin( ) 函数返回一个指向向量开头的迭代器。
a.begin();
//end( ) 函数返回一个指向向量末尾的迭代器。
a.end();

//cbegin()和cend()是C++11新增的,它们返回一个const的迭代器,不能用于修改元素
a.cbegin()
a.cend()

//获取向量中的元素个数
a.size()
//判断向量是否为空
a.empty()
//清空向量中的元素
a.clear()
//将1000插入到向量a的起始位置前
a.insert(a.begin(), 1000);
//将1000分别插入到向量元素位置的0-2处
a.insert(a.begin(), 3, 1000);
//a向量与b向量进行交换
b.swap(a);
//删除最后一个元素
v5.pop_back();
//加入一个元素并把它放在最后
v5.push_back(6);
//删除第四个元素
v5.erase(v5.begin() + 3);



//创建一个10*5的int型二维
vector< vector<int> > b(10, vector<int>(5)); 

//C++11 container initializer
vector<string> vs={"first", "second", "third"};

STL map

#include<iostream>
#include<map>
#include<string>
 
using namespace std;
 
int main(){
    // 构造函数
    map<string, int> dict;
    // 插入数据的三种方式
    dict.insert(pair<string,int>("apple",2));
    dict.insert(map<string, int>::value_type("orange",3));
    dict["banana"] = 6;
 
    // 判断是否有元素
    if(dict.empty())
        cout<<"该字典无元素"<<endl;
    else
        cout<<"该字典共有"<<dict.size()<<"个元素"<<endl;
 
    // 遍历
    map<string, int>::iterator iter;
    for(iter=dict.begin();iter!=dict.end();iter++)
        cout<<iter->first<<ends<<iter->second<<endl;
 
    // 查找
    if((iter=dict.find("banana"))!=dict.end()) //  返回一个迭代器指向键值为key的元素,如果没找到就返回end()
        cout<<"已找到banana,其value为"<<iter->second<<"."<<endl;
    else
        cout<<"未找到banana."<<endl;
 
    if(dict.count("watermelon")==0) // 返回键值等于key的元素的个数
        cout<<"watermelon不存在"<<endl;
    else
        cout<<"watermelon存在"<<endl;
    return 0;
}

STL unordered_map

#include<string>  
#include<iostream>  
#include<unordered_map>
using namespace std;  
  
int main()
{
    unordered_map<string, int>  dict; // 声明unordered_map对象

    // 插入数据的三种方式
    dict.insert(pair<string,int>("apple",2));
    dict.insert(unordered_map<string, int>::value_type("orange",3));
    dict["banana"] = 6;

    // Create an unordered_map of three strings (that map to strings)
    std::unordered_map<std::string, std::string> u = {
        {"RED","#FF0000"},
        {"GREEN","#00FF00"},
        {"BLUE","#0000FF"}
    };

    // 判断是否有元素
    if(dict.empty())
        cout<<"该字典无元素"<<endl;
    else
        cout<<"该字典共有"<<dict.size()<<"个元素"<<endl;
    // 遍历
    unordered_map<string, int>::iterator iter;
    for(iter=dict.begin();iter!=dict.end();iter++)
        cout<<iter->first<<ends<<iter->second<<endl;
    // 查找
    if(dict.count("boluo")==0)
        cout<<"can't find boluo!"<<endl;
    else
        cout<<"find boluo!"<<endl;
    if((iter=dict.find("banana"))!=dict.end())
        cout<<"banana="<<iter->second<<endl;
    else
        cout<<"can't find boluo!"<<endl;
    return 0;
}

STL set

using namespace std; 
  
int main() 
{ 
    // declaring set for storing string data-type 
    unordered_set<string> stringSet; 
  
    // inserting various string, same string will be stored 
    // once in set 
    stringSet.insert("code"); 
    stringSet.insert("in"); 
    stringSet.insert("c++"); 
    stringSet.insert("is"); 
    stringSet.insert("fast"); 
  
    string key = "slow"; 
  
    //find returns end iterator if key is not found, 
    //else it returns iterator to that key 
    if (stringSet.find(key) == stringSet.end()) 
        cout << key << " not found\n\n"; 
    else
        cout << "Found " << key << endl << endl; 
  
    key = "c++"; 
    if (stringSet.find(key) == stringSet.end()) 
        cout << key << " not found\n"; 
    else
        cout << "Found " << key << endl; 
  
    // now iterating over whole set and printing its 
    // content 
    cout << "\nAll elements : "; 
    unordered_set<string> :: iterator itr; 
    for (itr = stringSet.begin(); itr != stringSet.end(); itr++) 
        cout << (*itr) << endl; 
}

slow not found

Found c++

All elements : 
is
fast
c++
in
code

//创建空集合,不包含任何元素
set c:
//以op为排序准则,产生一个空的set
set c(op)
//复制c2中的元素到c1中
set c1(c2)
//复制[first, last)之间元素构成新集合
set c(const value_type *first, const value_type* last)
//以op为排序准则,复制[first, last)之间元素构成新集合。
set c(const value_type *first, const value_type* last,op)
//销毁所有元素,释放内存
c.~set()

//返回容器元素个数
int size() const
//判断容器是否为空,若返回true,表明容器已空
bool empty() const

//插入元素x
pair<iterator,bool> insert( x)
//在迭代器it处插入元素x
iterator insert(iterator it,x)
//插入[first, last)之间元素
void insert(const value_type *first,const value_type *last)
//删除迭代器指针it处元素
iterator erase(iterator it)
//删除[first, last)之间元素
iterator erase(iterator first,iterator last)
//删除元素值等于key的元素
size_type erase(const Key& key)

//返回首元素的迭代器指针
iterator begin()
//返回尾元素的迭代器指针
riterator end()

STL reverse函数

//转换0~5下标的元素
std::reverse(a,a+5);

STL min_element/max_element

cout<<"min_element: "<<*min_element(myvec.begin(),myvec.end())<<endl;
cout<<"max_element: "<<*max_element(myvec.begin(),myvec.end())<<endl;

STL substr()

// string::substr
#include <iostream>
#include <string>
int main (){
    std::string str="We think in generalities, but we live in details.";
    // (quoting Alfred N. Whitehead)
    std::string str2 = str.substr (3,5); // "think"
    std::size_t pos = str.find("live"); // position of "live" in str
    std::string str3 = str.substr (pos); // get from "live" to the end
    std::cout << str2 << ' ' << str3 << '\n';
    return 0;
}

STL deque 双向数组

//创建一个空的deque
deque<Elem> c
//复制一个deque
deque<Elem> c1(c2) 
//创建一个deque,含有n个数据,数据均已缺省构造产生。
deque<Elem> c(n) 
//创建一个含有n个elem拷贝的deque。
deque<Elem> c(n, elem) 
//创建一个以[beg;end)区间的deque。
deque<Elem> c(beg,end) 
//销毁所有数据,释放内存。
~deque<Elem>()

//返回指向第一个元素的迭代器
c.begin()
//返回指向最后一个元素下一个位置的迭代器
c.end()

//在末尾位置插入元素
c.push_back(num)
//删除末尾位置的元素
c.pop_back()
//在开头位置插入元素
c.push_front(num)
//删除开头位置的元素
c.pop_front()

//在pos位置插入元素num
c.insert(pos,num)
//删除pos位置的元素
c.erase(pos)

STL stack

stack <int> s; 
s.push(10); 
s.push(30); 
s.push(20); 
s.push(5); 
s.push(1); 

# 1 5 20 30 10
showstack(s);

# 5
s.size();
# 1
s.top();

s.pop;
# 5 20 30 10
showstack(s);

STL queue

#include <queue>
queue<int> q1;

//返回最后一个元素
q1.back()

//如果队列空则返回真
q1.empty()

//返回第一个元素
q1.front()

//删除第一个元素
q1.pop() 

//在末尾加入一个元素
q1.push()

//返回队列中元素的个数
q1.size()

STL的pair用法

//The pair container is a simple container defined in <utility> header consisting of two data elements or objects.
pair (data_type1, data_type2) Pair_name;

//CPP program to illustrate pair STL
#include <iostream>
#include <utility>
using namespace std;

int main()
{
    pair <int, char> PAIR1 ;

    PAIR1.first = 100;
    PAIR1.second = 'G' ;

    cout << PAIR1.first << " " ;
    cout << PAIR1.second << endl ;

    return 0;
}

STL的sort用法

// sort algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::sort
#include <vector>       // std::vector

bool myfunction (int i,int j) { return (i<j); }

struct myclass {
  bool operator() (int i,int j) { return (i<j);}
} myobject;

int main () {
  int myints[] = {32,71,12,45,26,80,53,33};
  std::vector<int> myvector (myints, myints+8);               // 32 71 12 45 26 80 53 33

  // using default comparison (operator <):
  std::sort (myvector.begin(), myvector.begin()+4);           //(12 32 45 71)26 80 53 33

  // using function as comp
  std::sort (myvector.begin()+4, myvector.end(), myfunction); // 12 32 45 71(26 33 53 80)

  // using object as comp
  std::sort (myvector.begin(), myvector.end(), myobject);     //(12 26 32 33 45 53 71 80)

  // print out content:
  std::cout << "myvector contains:";
  for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

STL的优先队列priority_queue

#include<iostream>
#include<queue>
using namespace std;
 
int main(){
	priority_queue<int> p;
	p.push(1);
	p.push(2);
	p.push(8);
	p.push(5);
	p.push(43);
	for(int i=0;i<5;i++){
		cout<<p.top()<<endl;
		p.pop();
	}

	//emplace 最大的作用是避免产生不必要的临时变量
	std::vector<Foo> v;
	// 没有临时变量产生
	v.emplace(someIterator, 42, 3.1416);
	return 0;
}

STL::accumulate

   // accumulate函数的第一个功能,求和
   int total;
   total = accumulate ( v1.begin ( ) , v1.end ( ) , 0 );

   cout << "整数从1到20的和为: " 
        << total << "." << endl;

for

for (int num : nums) {
  if (ones > n / 2 || zeros > n / 2) break;
  if ((num & (1 << i)) != 0) ++ones;
  else ++zeros;
}

string类

//字符串拼接
void main(){
    string s1 = "alan";
    string s2 = "xiho";

    //alanxiho
    string s3 = s1 + s2;

    string s4 = " wahaha";

    s3.append(s4);

    //alanxiho wahaha
    cout << s3 << endl;

    system("pause");
}

//string长度
string s = "c plus plus";
int len = s.length();
cout<<len<<endl;

#include <string>
using namespace std;

//string遍历
void main(){
    string s1 = "abcdefg";

    //1、数组方式
    cout << "数组方式:" << endl;
    for (int i = 0; i < s1.length(); i++){
        cout <<s1[i] << endl;

    }

    //2、迭代方式
    cout << "迭代方式:" << endl;
    for (string::iterator it = s1.begin(); it != s1.end(); it++){

        cout<<*it<< endl;

    }

    system("pause");
}

C 风格字符串

#include <iostream>
#include <cstring>
 
using namespace std;
 
int main ()
{
   char str1[11] = "Hello";
   char str2[11] = "World";
   char str3[11];
   int  len ;
 
   // 复制 str1 到 str3
   strcpy( str3, str1);
   cout << "strcpy( str3, str1) : " << str3 << endl;
 
   // 连接 str1 和 str2
   strcat( str1, str2);
   cout << "strcat( str1, str2): " << str1 << endl;
 
   // 连接后,str1 的总长度
   len = strlen(str1);
   cout << "strlen(str1) : " << len << endl;
 
   return 0;
}

c class

#include <iostream>
 
using namespace std;
 
class Box
{
   public:
      double length;         // 长度
      double breadth;        // 宽度
      double height;         // 高度
 
      // 成员函数声明
      double getVolume(void);
      void setLength( double len );
      void setBreadth( double bre );
      void setHeight( double hei );
      Box();   // 这是构造函数声明
      ~Box();  // 这是析构函数声明
};
 
// 成员函数定义
double Box::getVolume(void)
{
    return length * breadth * height;
}
 
void Box::setLength( double len )
{
    length = len;
}
 
void Box::setBreadth( double bre )
{
    breadth = bre;
}
 
void Box::setHeight( double hei )
{
    height = hei;
}
 
// 程序的主函数
int main( )
{
   Box Box1;                // 声明 Box1,类型为 Box
   Box Box2;                // 声明 Box2,类型为 Box
   double volume = 0.0;     // 用于存储体积
 
   // box 1 详述
   Box1.setLength(6.0); 
   Box1.setBreadth(7.0); 
   Box1.setHeight(5.0);
 
   // box 2 详述
   Box2.setLength(12.0); 
   Box2.setBreadth(13.0); 
   Box2.setHeight(10.0);
 
   // box 1 的体积
   volume = Box1.getVolume();
   cout << "Box1 的体积:" << volume <<endl;
 
   // box 2 的体积
   volume = Box2.getVolume();
   cout << "Box2 的体积:" << volume <<endl;
   return 0;
}

使用初始化列表来初始化字段

Line::Line( double len): length(len)
{
    cout << "Object is being created, length = " << len << endl;
}
//上面的语法等同于如下语法:
Line::Line( double len)
{
    length = len;
    cout << "Object is being created, length = " << len << endl;
}

lambda 表达式

[capture](parameters)->return-type{body}

[](int x, int y){ return x < y ; }

//无返回值
[capture](parameters){body}
[]{ ++global_x; } 

//指定返回值类型
[](int x, int y) -> int { int z = x + y; return z + x; }

//C++变量传递有传值和传引用的区别
[]      // 沒有定义任何变量。使用未定义变量会引发错误。
[x, &y] // x以传值方式传入(默认),y以引用方式传入。
[&]     // 任何被使用到的外部变量都隐式地以引用方式加以引用。
[=]     // 任何被使用到的外部变量都隐式地以传值方式加以引用。
[&, x]  // x显式地以传值方式加以引用。其余变量以引用方式加以引用。
[=, &z] // z显式地以引用方式加以引用。其余变量以传值方式加以引用。

memset

//在一段内存块中填充某一个给定的值,常用于较大的对结构体和数组的清零操作。
char str[10];
str[9] = 'w';
memset(str,97,9);
//输出:a a a a a a a a a w

pow 指数

double x=8,  y=2;
double z;
z=pow(x,y);

template

模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。
模板是创建泛型类或函数的蓝图或公式。

template <class type> ret-type func-name(parameter list)
{
   // 函数的主体
}

模板函数

#include <iostream>
#include <string>
 
using namespace std;
 
template <typename T>
inline T const& Max (T const& a, T const& b) 
{ 
    return a < b ? b:a; 
} 
int main ()
{
 
    int i = 39;
    int j = 20;
    cout << "Max(i, j): " << Max(i, j) << endl; 
 
    double f1 = 13.5; 
    double f2 = 20.7; 
    cout << "Max(f1, f2): " << Max(f1, f2) << endl; 
 
    string s1 = "Hello"; 
    string s2 = "World"; 
    cout << "Max(s1, s2): " << Max(s1, s2) << endl; 
 
   return 0;
}

类模板

#include <iostream>
#include <vector>
#include <cstdlib>
#include <string>
#include <stdexcept>
 
using namespace std;
 
template <class T>
class Stack { 
  private: 
    vector<T> elems;     // 元素 
 
  public: 
    void push(T const&);  // 入栈
    void pop();               // 出栈
    T top() const;            // 返回栈顶元素
    bool empty() const{       // 如果为空则返回真。
        return elems.empty(); 
    } 
}; 
 
template <class T>
void Stack<T>::push (T const& elem) 
{ 
    // 追加传入元素的副本
    elems.push_back(elem);    
} 
 
template <class T>
void Stack<T>::pop () 
{ 
    if (elems.empty()) { 
        throw out_of_range("Stack<>::pop(): empty stack"); 
    }
    // 删除最后一个元素
    elems.pop_back();         
} 
 
template <class T>
T Stack<T>::top () const 
{ 
    if (elems.empty()) { 
        throw out_of_range("Stack<>::top(): empty stack"); 
    }
    // 返回最后一个元素的副本 
    return elems.back();      
} 
 
int main() 
{ 
    try { 
        Stack<int>         intStack;  // int 类型的栈 
        Stack<string> stringStack;    // string 类型的栈 
 
        // 操作 int 类型的栈 
        intStack.push(7); 
        cout << intStack.top() <<endl; 
 
        // 操作 string 类型的栈 
        stringStack.push("hello"); 
        cout << stringStack.top() << std::endl; 
        stringStack.pop(); 
        stringStack.pop(); 
    } 
    catch (exception const& ex) { 
        cerr << "Exception: " << ex.what() <<endl; 
        return -1;
    } 
}