Monthly Archives: September 2018

C++中string迭代器与reserve函数的冲突

1、迭代器做为容器与算法之间的桥梁方便了各种场景与功能的实现;
2、string类的迭代器相当于char*的指针;
3、string在被初始化或赋值后系统会分配一定大小的容量(mac下默认为22,超出后15+16*n);
4、string可通过capacity查看当前容量大小;
5、stri[……]

继续阅读

C++类的基本定义与使用

1、类的基本定义

1.1、class关键字+类名,类名使用大驼峰命名规则;
1.2、使用private、protected、public修饰成员属性与方法;
1.3、方法名使用大驼峰命名规则,成员属性使用m_xxxx下划线命名规则;
1.4、构造函数与析构函数名字与类名相同,无返回值类型,可重载,析构函数前加~;

1
2
3
4
5
6
7
8
9
10
11
12
class ClassName{
private:    // 私有属性与方法
    string  m_prop1;
protected:  // 保护属性与方法
    int     m_prop2;
public:     // 公开属性与方法
    double  m_prop3;
    // 构造函数与析构函数
    ClassName();
    ~ClassName();
    void    Method();
};

2、类方法的实现

2.1、在Cpp文件中,引用.h或.hpp文件,通过ClassName::Method()的方式实现类方法;
2.2、同一个Cpp文件中可实现多个类的方法,通过作用域限定符(::)区分;

1
2
3
4
5
6
ClassName::ClassName()
{
    // 这是默认的构造函数,可省略
    // 一般用来对象初始化工作;
    // 可重载
}

3、基本示例[……]

继续阅读

C++学习笔记

1、C++编译过程
1.1、预处理,编译器将C++代码中的宏、引用等预处理指定进行展开,生成.i或.ii文件;
1.2、编译,编译器将展开后的文件进行编译生成汇编文件.s;
1.3、汇编,汇编器将汇编文件汇编生成链接文件.o或.obj;
1.4、链接,链接器将链接文件与库文件或第三方文件链接生成二进制文件,即可执行文件;
1.5、第一个C++程序

1
2
3
4
5
6
7
8
#include 
 
using namespace std;
 
int main(){
    cout << "Hello Cpp!!" << endl;
    return 0;
}

2、变量名三条定律
2.1、变量名只能是下划线、字母、数字;
2.2、首字母只能是下划线、字母;
2.3、不能是保留字/关键字;

3、C++常用数据类型
3.1、int –> 32位 -2147483648~+2147483647;
3.2、short int –> 16位 -32768~+32767;
3.3、long int –> 32位 -2147483648~+2147483647;
3.4、long long int –> 64位 -9223372036854775808 ~ +9223372036854775807;
3.5、float 32位 –> -3.4E-38~+3.4E+38;
3.6、double 64位 –> -1.7E-308~+1.7E+308;
3.7、char 8位 –> -128~+127;
3.8、关于精度的一个示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include 
#include 
 
using namespace std;
 
int main(){
    int i = 1234567890;
    float f = 1234567890123456789;
    double d = 1234567890123456789;
    long double ld = 1234567890123456789;
    cout << setprecision(20);
    cout << i << "n" << f << "n" << d << "n" << ld << endl;
    return 0;
}

1234567890
1234567939550609408
1234567890123456768
1234567890123456789
Program ended with exit code: 0

4、经典冒泡排序C++实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include 
 
using namespace std;
 
int main()
{
    // 数组、数组长度、循环次数
    int array[] = {128, 1, 11, 3, 33, 71, 2, 31, 4, 25, 61};
    int len = sizeof(array) / sizeof(array[0]);
    int loop_count = len - 1;
    // 冒泡次数循环
    for (int i = 0; i < loop_count; i++){
        // 单次冒泡比较循环
        for (int j = 0; j < loop_count - i; j++){ if (array[j] > array[j+1]){
                array[j] = array[j] + array[j+1];
                array[j+1] = array[j] - array[j+1];
                array[j] = array[j] - array[j+1];
            }
        }
    }
    for (int i = 0; i < len; i++){
        cout << array[i] << endl;
    }
    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include 
 
using namespace std;
 
int main()
{
    // 数组、数组长度、循环次数(最后一个数不需要比较)
    int array[] = {2, 1, 4, 3, 6, 5, 8, 7, 10, 9};
    int len = sizeof(array) / sizeof(array[0]);
    int loop_count = len - 1;
    for (int i = 0; i < loop_count; i++){
        // 调换前假设当前第一个为最小数
        int min_index = i;
        // 从第1个开始循环,可减少一次循环
        for (int j = i + 1; j < len; j++){
            if (array[j] < array[min_index]){
                min_index = j;
            }
        }
        // 如果第一个为最小数,不交换
        if (i != min_index){
            array[i] = array[i] + array[min_index];
            array[min_index] = array[i] - array[min_index];
            array[i] = array[i] - array[min_index];
        }
    }
    // 重新打印数组中的值(排序后)
    for (int i = 0; i < len; i++){
        cout << array[i] << " ";
    }
    return 0;
}

[……]

继续阅读