在接触了快两年的Python编程后,一直以为C++很麻烦。因为C++不仅有着明确的变量类型,而且复杂的指针变量和奇形怪状的模板编程也让习惯于Python这类代码的人感到头大。
得益于项目需求,在大佬的指导下开始接触C++,发现目前的C++已经发展到很好用的级别了,一些语法堂的设置也让编程方便了许多,这篇博客就用来汇总并实时更新C++编程下的一些语法堂和小技巧,以备随时随地查看和使用。


Tips目录

  • 1 vector向量
  • 2 string字符串
  • 3 std::与namespace
  • 4 remove()文件删除
  • 5 for循环
  • 6 面向对象的几个小概念
  • 7 文件流读写
  • 8 c++ stream 流操作
  • 9 防止程序闪退
  • 10 列表List的替代
  • 11 构造函数与析构函数
  • 12 类的成员函数


1 vector向量

向量与python中的列表很像,只不过只能存储相同类型的变量,声明方式:

vector<string> string_vec;

从末尾增加元素:

string_vec.push_back(string);

从末尾删除元素:

string_vec.pop_back();

向量清空:

string_vec.clear();

创建二维向量:

vector<vector<int> > int_vec(5); //定义二维动态数组大小5行 

vector<vector<int> > int_vec(5, vector<int>(6)); //定义二维动态数组5行6列

其他方法:

1.push_back 在数组的最后添加一个数据

2.pop_back 去掉数组的最后一个数据

3.at 得到编号位置的数据

4.begin 得到数组头的指针

5.end 得到数组的最后一个单元+1的指针

6.front 得到数组头的引用

7.back 得到数组的最后一个单元的引用

8.max_size 得到vector最大可以是多大

9.capacity 当前vector分配的大小

10.size 当前使用数据的大小

11.resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值

12.reserve 改变当前vecotr所分配空间的大小

13.erase 删除指针指向的数据项

14.clear 清空当前的vector

15.rbegin 将vector反转后的开始指针返回(其实就是原来的end-1)

16.rend 将vector反转构的结束指针返回(其实就是原来的begin-1)

17.empty 判断vector是否为空

18.swap 与另一个vector交换数据

参考于https://www.runoob.com/w3cnote/cpp-vector-container-analysis.html

2 string字符串

C++中的string与python的str十分类似,基本上方法都是一样的。
声明:

string str1 = "Hello";
 string str2 = "mangodog"

连接:

str1 = str1 + str2;
str1.append(str2);

长度:

str1.size();

3 std::与namespace

std::是个c++的名称空间标识符,c++标准库中的函数或者对象都要在std下使用,其实这算是为了解决c++调用函数没有 库.函数名 的问题,防止函数名冲突。
c++下基本上所有的方法和函数都要在std下使用,两种方法:

std::cout << "111" << std::endl;  // 方法一,最为保险但是麻烦
using namespace std;  // 方法二,一劳永逸

int main(){
	cout << "111" << endl;  
}

其中namespace是命名空间的意思,熟悉python tensorflow的话会发现这个和with_name_scope函数有着一样的功能,都是为了保证函数或者变量名在指定作用域不会重复。
例如:

namespace space{
	string a = "1";
};

space::a  // "1"

python不会有这个问题,因为python使用 库.函数 的方式进行访问。

4 remove()文件删除

这是c++种专门用于文件删除的函数,原型:

int remove(const char * filename);

如果删除成功返回0,否则返回-1
由于里面要求const char,因此需要将string等进行转化,string.c_str()即可。

5 for循环

python中的for 循环分为两种:for i in range(6)和for list in lists,现在c++除了传统的for( ; ; )以外,也多了一种类似for list in lists的循环访问方式。
for循环1:

for(int i=1; i <6; i++){
}

for循环2:

vector<int> is = {1,2,3,4,5};
for(auto i : is){
}

支持auto for的数据结构除了vector还有string。

6 面向对象的几个小概念

重构(Refactoring):函数名不变,函数功能不变,但是把代码重新好好写了一遍。
重写(override):子类继承父类方法时,将父类方法给覆盖了,功能可能变了,但是函数名和参数都没有变化。重写是在继承关系下的一种表现。
重载(overload): 在一个类定义中,可以编写几个参数不同但是同名的方法,c++会将它们看做唯一的方法。简单的说,一个类中的方法与另一个方法同名,但是参数表不同,这种方法称之为重载方法。

7 文件流读写

.在C++中对文件进行操作分为以下几个步骤:
(1)建立文件流对象;
(2)打开或建立文件;
(3)进行读写操作;
(4)关闭文件;
实际上步骤与python的open()操作是十分相似的,只不过操作起来麻烦一点。
读文件:

#include<fstream>
#include<iostream>
...
string readfile(string filepath) {
		ifstream filetemp(filepath); // (1)建立文件流对象;  (2)打开或建立文件;
		string cons_str{}, str_temp;
		
		while (getline(filetemp, str_temp))  // (3)进行读写操作;
			cons_str.append(str_temp + "\n");
		filetemp.close();  // (4)关闭文件;
		return cons_str;
	}

写文件:

file_name = "a.txt";
ofstream os_cons1(file_name, ios::app);  
os_cons1 << "mangodog" << endl;
os_cons1.close();

8 c++ stream 流操作

C++中把数据之间的传输操作称为流,并通过重载运算符 “<<” 和 “>>” 执行输入和输出操作。
常用的流操作只有四个,分别是cin、cout、ofstream、ifstream,用于控制台和文件的输入输出。

9 防止程序闪退

正常情况下程序运行完成后会自动退出,在VS2019中已经不需要对其进行处理,但是在之前的程序中需要让命令行窗口停下来,方法:

getchar();
while(1);
system("pause");

10 列表List的替代

python中有强大的list数据结构支撑,不仅支持灵活的增、删、改、查等操作,而且还可以存储任意的数据类型。
对于python的列表,c++可以用vector和结构体来进行替代。
对于由同一类型数据组成的list,c++中可以用vector来代替和使用;
对于由不同类型数据组成的list,c++中可以用结构体来代替和使用。

11 构造函数与析构函数

C++中的构造函数在类内部表示为和类名一样的函数,与python中的self.__init__是一样的,实例化的时候会被首先调用执行。

class Box
{
      Box(double l=2.0, double b=2.0, double h=2.0)
      {
         cout <<"Constructor called." << endl;
         length = l;
         breadth = b;
         height = h;
      }
      ~Box();
      double Volume()
      {
         return length * breadth * height;
      }

};

析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号~作为前缀。
析构函数不会有任何返回值,也不会带有任何参数,用于内存的删除过程。
析构函数反应的是在删除类内存的时候需要做的事情,比如打印“我被删除了这样类似的内容”。

12 类的成员函数

C++里的类成员函数与python中在class定义的类方法、实例方法、静态方法是一致的,但是C++的成员函数却可以在类的外部定义,使用::符号进行定义。

double Box::getVolume(void)
{
    return length * breadth * height;
}