在接触了快两年的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;
}