C++汇总


//枚举
//static int
//仿函数
//list列表 https://blog.csdn.net/yas12345678/article/details/52601578
//chrono cout << chrono::duration_cast chrono::seconds(2).count() << endl; //2分钟换算为120秒
//运算符重载 https://www.runoob.com/cplusplus/cpp-overloading.html
//句柄 https://blog.csdn.net/wyx0224/article/details/83385168
//mat at和ptr读取 https://blog.csdn.net/u011574296/article/details/70139563
//back_inserter https://blog.csdn.net/github_35681219/article/details/52564780
//reverse和resize https://blog.csdn.net/sinat_38183777/article/details/82056289

8 枚举

枚举类型:https://www.runoob.com/w3cnote/cpp-enum-intro.html

9 字符串

#include<iostream>
#include<cstring>
#include<string>
#include<sstream>
using namespace std;

int main()
{
	/*
		## 1 C风格字符串和string字符串 
		a) strcpy, strcat, strlen;#include<cstring>
		b) string, 相加赋值,.length,.size;#include<string>
		c) string转char*; char*转string;strcpy
		d) int转string; to_string和#include<sstream> stringstream;
		e) 字符串判空
		f) 查找字符串
		g) 截取字符串
	*/

	// a)
	char str1[13] = "runoob";
	char str2[13] = "google";
	char str3[13];
	int  len;
	
	strcpy(str3, str1);  // str3: runoob
	strcat(str1, str2);  // str1: runoobgoogle
	len = strlen(str1);  // 12
	 
	// b) 
	string str11 = "runoob";
	string str22 = "google";
	string str33;
	
	str33 = str11;  //str33: runoob
	str33 = str11 + str22;  //str33: runoobgoogle
	len = str33.size();  // len: 12
	len = str33.length();  //12;

	// c)
	const char * s1 = str11.c_str();  // string转const char*
	string s11 = s1;  // char* 转string
	cout << s11 << endl;

	char str4[13];
	string str44 = "hello";
	strcpy(str4, str44.c_str());
	cout << str4 << endl;

	// d) 

	// 方法1
	int num1 = 123;
	stringstream ss;
	ss << num1;
	string strnum1 = ss.str();
	string strnum11;
	ss >> strnum11;
	cout << strnum1 << endl;
	cout << strnum11 << endl;

	// 方法2
	int num2 = 456;
	string strnum2;
	strnum2 = to_string(num2);
	cout << strnum2 << endl;

	// e)
	string str7 = "";
	string str8;
	string str9 = "123";
	cout << str7.empty() << endl; //1
	cout << str8.empty() << endl; //1
	cout << str9.empty() << endl; //0

	// f)
	string str00 = "niohaoh";
	string str01 = "ha";
	size_t loc = str00.find(str01);  //3
	size_t loc1 = str00.find("o");  //2找的是第一个的位置
	size_t loc2 = str00.find_last_of("o");  //5, 对应也有find_first_of

	//g )
	string str02 = str00.substr(loc);  // 从loc到结尾, 输出:haoh
	str02 = str00.substr(2, 4);  //从下标为2开始向后数4位。
	cout << str02 << endl;

	string str = "image007.jpg";
	string cut = str.substr(str.find_last_of(".") + 1);

	return 0;
}

10 sort/reverse、vector、数组、字符串、动态数组

1)string: https://blog.csdn.net/liitdar/article/details/80498634

#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;

# define NUM 5

bool cmpy(cv::Point2d const& pt1, cv::Point2d const& pt2)  //const& 直接引用,但不改变值
{
	return pt2.x < pt1.x;  //从大到小;<变成>,从大到小
}

int main()
{
	/*
		## sort和reverse专题
		1 sort和reverse都需要头文件#include<algorithm>
		2 将内存中的数据反向一下,只需要有首尾地址;如:数组、向量、字符串
		3 按指定的规则排序,如:对像素按照x方向从小到大排序
	*/
	
	cout << "sort:-------------------------- " << endl;
	
	//a)数组
	int arr[10] = { 9, 0, 1, 2, 3, 7, 4, 5, 100, 10 };
	sort(arr, arr + 10);  //从小到大排列,注意:这里是+10,而不是+9
	reverse(arr, arr+10);  //逆序
	
	//b)向量
	vector<int> vec1;
	for (int i = 0; i < 10; i++)
	{
		vec1.push_back(i);
	}
	reverse(vec1.begin(), vec1.end());
	sort(vec1.begin(), vec1.end());

	//c)字符串
	string str = "hello world , hi";
	reverse(str.begin(), str.end());
	sort(str.begin(), str.end());


	//d)自定义排序(cv::point)
	vector<cv::Point2d> vec;
	vec.push_back(cv::Point2d(1, 2));
	vec.push_back(cv::Point2d(4, 4));
	vec.push_back(cv::Point2d(3, 4));
	sort(vec.begin(), vec.end(), cmpy);
	for (int i = 0; i < 3; i++)
	{
		cout << vec[i] << endl;
	}



	/*
		## vector专题
		 包含头文件#include<vector>; #include"opencv2/opencv.hpp"中有包含#include<vector>
		 1 初始化:指定大小、指定初始化元素
		 2 插入、弹出元素;清空向量;向量长度;
		 *3 元素访问:星号*、中括号访问和迭代器访问;
		     迭代器:https://www.cnblogs.com/abtious/p/13729543.html
			 本质是封装了原生指针,是指针概念的一种提升,提供了比指针更高级的行为,相当于一种智能指针,可以根据不同类型的数据结构来实现不同的++,--等操作;
		     指针能指向函数而迭代器不行,迭代器只能指向容器;
		     指针是迭代器的一种。指针只能用于某些特定的容器;迭代器是指针的抽象和泛化。
		 *4 调整vector大小
		 *5 二维vector:两种方式
		 *6 arr初始化vector
		 补充:先定义vector<int> v(10),再v.push_back(1),最后长度变为11,刚push进去的1放到了最后
	 */

	cout << "vector---------------" << endl;
	// 1)
	vector<int> v0;		//size为0
	vector<int> v(5);	//全0
	vector<int> v1(5, 1);  //全1
	cout << v.size() << endl;  //5
	v.push_back(2);  //size: 6

	// 2)
	vector<cv::Point2d> vec(10);
	vec.push_back(cv::Point2d(1, 2));  //末尾插入元素
	vec.push_back(cv::Point2d(3, 4));
	cout << vec[1] << endl;  // cv::Point2d(3, 4)
	vec.pop_back();  //弹出末尾元素
	cout << vec.size() << endl;  // 1 
	vec.clear();  //清空向量
	cout << vec.size() << endl;  // 0

	// 3)
	vec.push_back(cv::Point2d(1, 2));
	vec.push_back(cv::Point2d(4, 4));
	vec.push_back(cv::Point2d(3, 4));
	cout<< *(vec.begin())<<*(vec.begin()+1)<<endl; //
	cout << vec[0] << endl;
	vector<cv::Point2d>::iterator it; 
	for (it = vec.begin(); it != vec.end(); it++)
	{
		cout << *it << " * ";
	}

	// 4)
	vector<int> vec2;	//size:0
	vec2.resize(10);	//size:10

	// 5)
	int N = 5, M = 6;
	vector<vector<int>> vec3(N, vector<int>(M, 10));
	vector<vector<int>> vec4(N);
	for (int i = 0; i < vec3.size(); i++)
	{
		for (int j = 0; j < vec3[i].size(); j++)
		{
			cout << vec3[i][j] << " ";  //输出全是10
		}
		cout << endl;
	}

	for (int i = 0; i < vec4.size(); i++)
	{
		vec4[i].resize(M);
	}
	for (int i = 0; i < vec4.size(); i++)
	{
		for (int j = 0; j < vec4[i].size(); j++)
		{
			cout << vec4[i][j] << " ";  //输出全是0
		}
		cout << endl;
	0}

	// 6)
	int arr[6] = { 1, 3, 4, 6, 8, 9};
	vector<int> vec(arr, arr+6);

	/*
		## 数组
		1 定义:常量
		2 初始化:啥也不空、空中括号、空等号、空大括号、默认为0、两数组之间不能直接初始化
		3 数组性质:元素调用(有效下标)、数组长度
	*/
	cout << "数组------------- " << endl;
	int arr1[10];
	int arr2[sizeof(int)];
	int arr3[NUM]; 

	int arr4[2] = {2, 3};
	int arr5[] = {1, 2};
	int arr6[]{ 3,4 };
	int arr7[5] = {};
	int arr8[5] = {1};
	//int arr9[5] = arr8;
	
	cout << arr4[0] << endl;
	cout<<arr4<<endl;  //不可以直接输出数组,这样输出是地址
	cout << sizeof(arr4) << endl;
	cout << sizeof(arr4[0]) << endl;



	/*
		## 字符串
		1 定义:char数组(不以'\0'结尾,碰到'\0'输出结束)、char数组+以'\0'结尾、
		2 初始化:字符串常量代替char数组,""中的字符数不能超过数组长度,如char str2[5] = "hello",数组长度是可以大于字符串长度的
		3"S"表示字符串长度,由S和\0组成,"S"表示的是字符串所在的地址,不能直接赋值给char类型,如char a = "S";
		4 字符串性质:sizeof求得的字符串长度为数组长度,strlen求得的字符串长度为可见字符长度不算'\0'长度
		5 字符串拼接,前一个字符串的\0被后一个元素覆盖
	*/
	cout << "字符串------------- " << endl;
	char arr[5] = { 'h', 'e','l','l','o'};
	char str1[5] = { 'h','e','l','l','\0'};

	char str2[5] = "hell"; 
	char str3[9] = "hell";   

	char str4[] = "S";

	cout << sizeof(str3) << endl; // 9
	cout << strlen(str3) << endl; // 4

	cout << "111" "222" << endl;  //输出"111222"
	cout<<str2<<endl; //hell
	cout<<str2+1<<endl;  //ell

	/*
		## 指针
		1 定义:存储地址变量int* p = &sum; p指向int类型的指针。p地址长度取决于电脑位数。
		2 C++创建指针时,计算机将分配用来存储地址的内存,但不会分配用来存储指针所指向数据的内存。
		(也就是,计算机会分配一个空内存,用于存放地址,等着地址传进来;如,int* p; p是空的,指向哪里不知道,没有被初始化;*p指向的东西更不可知)
		3 指针不是整型,不能简单的将整型地址赋值给指针;如,int* pt;pt = 0x1111222211112222; 非要将数字变为地址,可以通过强制转整pt = (int*)0x1111222211112222;
		4 指针用途:在运行阶段分配未命名的内存来存储值。C,malloc();C++,new,告知数据类型
		5 new从堆或者自由存储区分配内存,一般的变量是从栈分配内存。
	*/
	cout << "指针------------- " << endl;
	double sum = 5;
	double* p = &sum;  //8字节,电脑64位

	int* p1 = new int;  //这里说p1指向的内存没有名称,可以说指向一个数据对象。
	*p1 = sum;
	cout << *p1 << endl;
	delete p1;
	//cout << *p1 << endl;



	/*
		## 动态数组
		1 new []和delete[]
		2 元素的读取,指针和数组基本等价
		3 区别:1)p=p+1,适用于指针,不适用于数组,错:arr=arr+1;不能修改数组名的值,但能修改指针的值。
		       2)sizeof()指针和数组名不同
		4 相同:数组名解释为首元素地址
	*/
	cout << "动态数组------------- " << endl;
	int* p = new int[3];
	p[0] = 1;
	p[1] = 2;
	p[2] = 3;
	cout << p[0] << endl;  // 1
	p = p + 1;  //指针值增加1,也就是地址增加(1*sizeof(类型))字节;
	cout << p[0] << endl;  //2
	delete[]p;
	double arr1[3] = { 1.1,2.2,3.3 };
	double *p1 = arr1;
	double *p2 = &arr1[0];

	cout << arr1[0] << endl;  //也可以这样用*arr1
	cout << *p1 << " " << p1[0] << " " << *(p1 + 1) << endl;
	cout << sizeof(p1) << " " << sizeof(arr1) << endl;  //8和24,地址的长度和数组的长度
	//注意:数组不能这样arr=arr+1,动态数组(指针)能够这样p=p+1

	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值