一些编程过程中需要搞明白的基础问题
目录
static_cast------运算符完成相关类型之间的转换
reinterpret_cast------处理互不相关类型之间的转换
dynamic_cast------处理基类型到派生类型的转换
一、强制类型转换
强制类型转换的时候,转换了数据的类型,是否转换了内存区中的数据?例如int与unsigned int, 内存区中为0xFFFF表示的数值是不一样的。
1.1 四种强制类型转换关键字
https://www.cnblogs.com/ShalenChe/p/5447457.html
https://www.cnblogs.com/junlinfeizixiao/p/6193412.html
c++提供了4种类型转换操作符来应对不同场合的应用。
const_cast static_cast dynamic_cast reinterpreter_cast
4种关键字的使用形式如下:
TYPE b = static_cast(TYPE)(a)
- 去const属性用const_cast。
- 基本类型转换用static_cast。
- 多态类之间的类型转换用daynamic_cast。
- 不同类型的指针类型转换用reinterpreter_cast。
const_cast用来移除const或volatile
强制去掉const(或volatile) 必须使用const_cast 。
使用了const_cast及引用类型之后,常量的值也是可以进行更改的。
static_cast------运算符完成相关类型之间的转换
类似于C风格的强制转换。无条件转换,静态类型转换。用于:
1. 基类和子类之间转换:其中子类指针转换成父类指针是安全的;但父类指针转换成子类指针是不安全的。(基类和子类之间的动态类型转换建议用dynamic_cast)
2. 基本数据类型转换。enum, struct, int, char, float等。static_cast不能进行无关类型(如非基类和子类)指针之间的转换。
3. 把空指针转换成目标类型的空指针。
4. 把任何类型的表达式转换成void类型。
5. static_cast不能去掉类型的const、volitale属性(用const_cast)。
例: 1, int m=10;
double n=static_cast < int > m;
2, int * q=static_cast < int* >(malloc(100));
例: int n = 6;
double d = static_castdouble>(n); // 基本类型转换
int *pn = &n;
double *d = static_castdouble *>(&n) //无关类型指针转换,编译错误
void *p = static_castvoid *>(pn); //任意类型转换成void类型
reinterpret_cast------处理互不相关类型之间的转换
如从整型到指针,一种类型的指针到另一种类型的指针等
例: int a=10;
double* b=reinterpret_cast<double*>(a); //b的转换结果为0x0000000a
dynamic_cast------处理基类型到派生类型的转换
基类必须有虚函数,即为多态时,可以转换
二、测试与时间相关
2.1 sleep函数
linux下头文件为unistd.h
sleep为秒级别,usleep为微妙级别,秒的10负6次方。
三、vector函数
https://www.cnblogs.com/LGJC1314/p/6680054.html
https://www.cnblogs.com/shrimp-can/p/5280566.html
vector在c++之中出现频繁,需要多加注意。
3.1 二维vector的遍历
https://blog.csdn.net/fendou123kaixin/article/details/51259873
遍历一个二维数组,看数组中是否有该函数
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
bool target_exist=false;
for(vector<vector<int>>::iterator current_row_it=array.begin(); current_row_it != array.end(); ++current_row_it){
for(int current_col=0; current_col<(*current_row_it).size(); ++current_col){
if(target==(*current_row_it)[current_col])target_exist=true;
}
}
return target_exist;
}
};
注意,输出的时候,需要!=array.end(),说明array.end()是vector最后一个元素再后一位
vector的遍历完全可以通过更加简单的方法进行:
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
bool if_exist=false;
for(auto sub_vector:array){
for(auto value:sub_vector){
if(value==target){
if_exist=true;
break;
}
}
}
return if_exist;
}
};
3.2 一个不成功的遍历
https://www.nowcoder.com/question/next?pid=11647029&qid=117506&tid=25652925
输入例子1:
3
5
1 2 3 4 5
6
1 100 1000 1000 100 1
7
1 6 3 3 1 8 1
输出例子1:
5 4 3 2 1
1 100 1000
1 8 3 6
相应代码:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main(){
int num_groups;
cin >> num_groups;
vector<vector<int>> dialog;
for (int idx_group = 0; idx_group < num_groups; idx_group++){
int num_id; cin >> num_id;
vector<int> current_dialog;
for (int id_idx = 0; id_idx < num_id; id_idx++){
int current_id; cin >> current_id;
current_dialog.push_back(current_id);
}
dialog.push_back(current_dialog);
}
vector<vector<int>> processed_dialog;
for (int idx_group = 0; idx_group < num_groups; idx_group++){
vector<int> processed_vector;
processed_vector.push_back(dialog[idx_group][dialog[idx_group].size()-1]);
for (auto iterator = dialog[idx_group].end()-1; iterator >= dialog[idx_group].begin(); iterator--){
bool exist = false;
for (auto processed_id : processed_vector){
if (processed_id == *iterator){
exist = true;
break;
}
}
if (!exist)processed_vector.push_back(*iterator);
}
processed_dialog.push_back( processed_vector);
}
for (auto group_vecotr : processed_dialog){
for (auto id : group_vecotr){
cout << id << ' ';
}
cout << endl;
}
int end; cin >> end;
return 0;
}
3.3 插入与删除元素insert与erase
插入元素:
insert是在插入的元素之前。
vector_1.insert(v2.begin()+4,element); //在指定位置,例如在第五个元素前插入一个元素
vector_1.insert(v2.end(), element); //在末尾插入一个元素
vector_1.push_back(element); //在末尾插入一个元素
vector_1.insert(v2.begin(), element); //在开头插入一个元素
删除元素:
#include <iostream>
#include <vector>
int main ()
{
std::vector<int> myvector;
// set some values (from 1 to 10)
for (int i=1; i<=10; i++) myvector.push_back(i);
// erase the 6th element
myvector.erase (myvector.begin()+5);
// erase the first 3 elements:
myvector.erase (myvector.begin(),myvector.begin()+3);
std::cout << "myvector contains:";
for (unsigned i=0; i<myvector.size(); ++i)
std::cout << ' ' << myvector[i];
std::cout << '\n';
return 0;
}
3.4 sort函数
注意点:需要加#include<algorithm>头文件,升序则a<b,降序则a>b
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
bool cmp(int a,int b){
return (a < b) ? true : false;
}
int main()
{
//main2
vector<int> vector_a;
for (int idx = 10; idx >= 0; idx--){
vector_a.push_back(idx);
}
sort(vector_a.begin(), vector_a.end(), cmp);
for (auto item : vector_a)
cout << item << endl;
int end; cin >> end;
return 0;
}
对于数组而言,sort的时候需要指针位置是 a[len]的位置,注意此时溢出的位置。等同于向量的vector_a.end(),相当于向量最后一个元素再往后一位。
int main()
{
int a[10] = { 3, 2, 7, 4, 2, -999, -21, 99, 0, 9 };
int len = sizeof(a) / sizeof(int);
for (int i = 0; i < len; ++i)
cout << a[i] << ' ';
cout << endl;
sort(a, a+len, cmp);
for (int i = 0; i < len; ++i)
cout << a[i] << ' ';
cout << endl;
int end; cin >> end;
return 0;
}
四、VS及调试
创建空项目,然后,https://jingyan.baidu.com/article/f54ae2fc4732071e92b849d6.html
源文件,选择cpp文件。
#include <vector>
#include <stdio.h>
using namespace std;
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
vector<int> matrix_value;
int row_size = matrix.size();
int col_size = matrix[0].size();
if (row_size<1 || col_size<1)return matrix_value;
int left_wall = -1; int right_wall = col_size;
int up_wall = -1; int down_wall = row_size;
int row_loc = 0; int col_loc = 0;
while (matrix_value.size()<row_size*col_size){
if (row_loc<down_wall&&col_loc<right_wall){
for (; col_loc<right_wall; col_loc++)
matrix_value.push_back(matrix[row_loc][col_loc]);
up_wall++; col_loc--; row_loc++;
}
if (row_loc<down_wall&&col_loc>left_wall){
for (; row_loc<down_wall; row_loc++)
matrix_value.push_back(matrix[row_loc][col_loc]);
right_wall--; row_loc--; col_loc--;
}
if (row_loc>up_wall&&col_loc>left_wall){
for (; col_loc>left_wall; col_loc--)
matrix_value.push_back(matrix[row_loc][col_loc]);
col_loc++; down_wall--; row_loc--;
}
if (row_loc>up_wall&&col_loc<right_wall){
for (; row_loc>up_wall; row_loc--)
matrix_value.push_back(matrix[row_loc][col_loc]);
left_wall++; col_loc++; row_loc++;
}
}
return matrix_value;
}
};
int main(){
vector<int> matrix_row;
matrix_row.push_back(0);
vector<vector<int> > matrix;
matrix.push_back(matrix_row);
class Solution solution;
vector<int> result=solution.printMatrix(matrix);
printf("program end!");
}
用VS调试时,最后加上
cout << "press any key and enter to exit" << endl;
int end;cin >> end;
五、long int 与long long int的尺寸
5.1 sizeof
#include <iostream>
using namespace std;
int main()
{
int int_num;
long int long_int_num;
long long int long_long_int_num;
//long long long int long_long_long_int_num;
cout << sizeof(int_num) << " ";
cout << sizeof(long_int_num) << " ";
cout << sizeof(long_long_int_num) << " ";
//cout<<sizeof(long_long_long_int_num);
cout << "press any key and enter to exit" << endl;
cin >> int_num;
return 0;
}
输出为
4 8 8
long int 与long long int都为8字节。即64个比特。
在VS2013中显示是 4 4 8
5.2 内存中的数
输出16进制的看内存中是什么样子。
#include <iostream>
using namespace std;
int main()
{
int int_num=-1;
long int long_int_num=-1;
long long int long_long_int_num=-1;
//long long long int long_long_long_int_num;
cout<<hex<<int_num<<endl;
cout<<hex<<long_int_num<<endl;
cout<<hex<<long_long_int_num<<endl;
//cout<<sizeof(long_long_long_int_num);
cout << "press any key and enter to exit" << endl;
cin >> int_num;
return 0;
}
输出:
ffffffff
ffffffffffffffff
ffffffffffffffff
5.3 最大的int数
#include <iostream>
using namespace std;
int main()
{
int max_int=0x7FFFFFFF;
cout<<max_int<<endl;
cout << "press any key and enter to exit" << endl;
cin >> int_num;
return 0;
}
2147483647
相当于 2,147,483,647
2e12
sizeof(int),无论32位或者64位下都为 4,32bit,每个字节8bit,每个16进制数4bit
所以2个16进制数是一个字节。
最大的正整数是0x7FFFFFFFF
最小的负整数是 0x80000000
绝对值比正负10^9大一点
2,147,483,647
-2,147,483,648
cout << "sizeof(int):"<<sizeof(int) << endl;
cout << "sizeof(float):" << sizeof(float) << endl;
cout << "sizeof(double):" << sizeof(double) << endl;
cout << "sizeof(long int):" << sizeof(long int) << endl;
cout << "sizeof(long long int):" << sizeof(long long int) << endl;
sizeof(int):4
sizeof(float):4
sizeof(double):8
sizeof(long int):4
sizeof(long long int):8
5.4 最大浮点数?
有待研究。
六、随机数
6.1 rand()
关于随机数的生成,有头文件,stdlib.h
注意此头文件中生成rand的随机数。范围就是int数的范围。
服务器上rand函数与c中的rand函数不一样。
#include<iostream>
#include<stdlib.h>
using namespace std;
int main(){
for(int idx=0;idx<10;idx++)
cout<<rand()<<endl;
return 0;
}
//结果如下:
1804289383
846930886
1681692777
1714636915
1957747793
424238335
719885386
1649760492
596516649
1189641421
VS2013环境下运行结果如下:
41
18467
6334
26500
19169
15724
11478
29358
26962
24464
press any key and enter to exit
rand函数界限:stdlib.h头文件中有宏#define RAND_MAX 0x7fff
rand产生一个0-0x7fff的随机数,即最大是32767的一个数
因此在VS中生成的不一样的rand函数。
6.2 abs函数
绝对值函数在stdlib.h库之中
表示绝对值。