//枚举
//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 = ∑ 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 = ∑ //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;
}