学习笔记-C++ STL篇

1、C++中vector作为参数的三种传参方式(传值 && 传引用 && 传指针)

https://blog.csdn.net/weixin_47641702/article/details/113522865

c++中常用的vector容器作为参数时,有三种传参方式,分别如下:
function1(vector vec),传值
function2(vector &vec),传引用
function3(vector *vec),传指针
注意,三种方式分别有对应的const形式,不在此讨论。
三种方式对应的调用形式分别为:
function1(vec),传入值
function2(vec),传入引用
function3(&vec),传入地址
三种方式的效果分别为:
会发生拷贝构造
不会发生拷贝构造
不会发生拷贝构造




2、error: creating array of references( declaration of 'a' as array)

https://blog.csdn.net/cs_zlg/article/details/8332622

错误程序:

#include <iostream>
using namespace std;
 
void func(int& a[], int n) {
    for(int i = 0; i < n; i++)
        a[i]++;
}

int main() {
    int a[3] = {1, 2, 3};
    func(a, 3);
    cout << a[0] << ' ' << a[1] << ' ' << a[2] << endl;
    return 0;
}

而这里给函数传递的是数组a的首地址,地址是无法再取地址的。实际上,把a的首地址传给函数后,函数已经获得修改数组a元素的能力。
解决方法:把函数func的参数列表中的“int& a[]”改为“int a[]”即可。

3、C++中给函数传参二维数组

https://blog.csdn.net/ManiacLook/article/details/124721648

void f1(int a[N][M]);
void f2(int a[][N]);
void f3(int (*a)[N]);
void f4(int *a);

#include <stdio.h>

/*********************************
* 方法1: 第一维的长度可以不指定 *
* 但必须指定第二维的长度 *
*********************************/

void print_a(int a[][5], int n, int m){
    int i, j;
    
    for(i = 0; i < n; i++){
        for(j = 0; j < m; j++)
            printf("%d ", a[i][j]);
        
        printf("\n");
    }
}

/*****************************************
*方法2: 指向一个有5个元素一维数组的指针 *
*****************************************/
void print_b(int (*a)[5], int n, int m){
    int i, j;
    
    for(i = 0; i < n; i++){
        for(j = 0; j < m; j++)
            printf("%d ", a[i][j]);
        printf("\n");
    }
}

/***********************************
*方法3: 利用数组是顺序存储的特性, *
* 通过降维来访问原数组! *
***********************************/
void print_c(int *a, int n, int m) {
    int i, j;
    
    for(i = 0; i < n; i++) {
        for(j = 0; j < m; j++)
            printf("%d ", *(a + i*m + j));
        
        printf("\n");
    }
}
int main(void) {
    int a[5][5] = {{1, 2}, {3, 4, 5}, {6}, {7}, {0, 8}};
    
    printf("\n方法1:\n");
    print_a(a, 5, 5);
    
    printf("\n方法2:\n");
    print_b(a, 5, 5);
    
    printf("\n方法3:\n");
    print_c(&a[0][0], 5, 5);
 
    return 0;
}




3、二维数组传递给函数参数

但是当数组的维度是变量的时候,上面的传参方法好像不行

void print_a(int a[][5], int n, int m){
    int i, j;

    for(i = 0; i < n; i++){
        for(j = 0; j < m; j++)
            printf("%d ", a[i][j]);

        printf("\n");
    }
}

/*****************************************
*方法2: 指向一个有5个元素一维数组的指针 *
*****************************************/
void print_b(int (*a)[5], int n, int m){
    int i, j;

    for(i = 0; i < n; i++){
        for(j = 0; j < m; j++)
            printf("%d ", a[i][j]);
        printf("\n");
    }
}

/***********************************
*方法3: 利用数组是顺序存储的特性, *
* 通过降维来访问原数组! *
***********************************/
void print_c(int *a, int n, int m) {
    int i, j;

    for(i = 0; i < n; i++) {
        for(j = 0; j < m; j++)
            printf("%d ", *(a + i*m + j));

        printf("\n");
    }
}

void print_d(int **a, int n, int m) {
    int i, j;

    for(i = 0; i < n; i++) {
        for(j = 0; j < m; j++)
            printf("%d ", *(a + i*m + j));

        printf("\n");
    }
}
int main(void) {
    int m=5;
    int n=5;
    int a[m][n];
    a[0][1] = 1;
    /*
    printf("\n方法1:\n");
    print_a(a, 5, 5);  //error: cannot convert 'int (*)[n]' to 'int (*)[5]'

    printf("\n方法2:\n");
    print_b(a, 5, 5);  //error: cannot convert 'int (*)[n]' to 'int (*)[5]'
    */
    printf("\n方法3:\n");
    print_c(&a[0][0], 5, 5);
    
    return 0;
}




3、 将二维数组作为二重指针传递时,只是将数组的头指针传递给了函数,其内部结构不清楚是否能够正确访问。

https://blog.csdn.net/u013684730/article/details/46565577




4、vector<pair<int,int>>的使用及注意点(方法报错)

https://blog.csdn.net/weixin_44915226/article/details/107362610?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2~default~CTRLIST~Rate-1-107362610-blog-81628852.t0_edu_mlt&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2~default~CTRLIST~Rate-1-107362610-blog-81628852.t0_edu_mlt&utm_relevant_index=1

power.emplace_back(make_pair(1,1));
power.emplace_back(2,2);




5、c++中为什么push_back({1,2})可以,emplace_back({1,2})会报错?

https://www.zhihu.com/question/438004429/answer/1731168143



6、variable-sized object may not be initialized

https://blog.csdn.net/m0_53641110/article/details/121169589
出现此错误的原因是可以用变量定义数组长度,但不可初始化。

posted @ 2022-09-26 23:50  种树人  阅读(64)  评论(0编辑  收藏  举报