我的c++最佳实践

协变珊瑚
• 阅读 4888

迭代时删除容器中的元素

http://www.cplusplus.com/reference/vector/vector/erase/
http://stackoverflow.com/questions/1604588/iterate-vector-remove-certa...

删除元素可能导致内存变动,因此迭代器会更新它的值,我们应用erase返回的新的迭代器,否则可能导致访问到不应该访问的内存。

for (auto it = container.begin(); it != container.end();) {
    if (condition) {
        it = container.erase(it);
    } else {
        it++;
    }
}

多维数组

http://www.cplusplus.com/forum/articles/7459/

STL vector

#include <vector>
using namespace std;

int main() {
    // construct array2D[HEIGHT][WIDTH]
    vector<vector<double> > array2D;

    array2D.resize(HEIGHT);
    for (int i = 0; i < HEIGHT; ++i)
        array2D[i].resize(WIDTH);


    // construct array3D[HEIGHT][WIDTH][DEPTH]
    vector<vector<vector<double> > > array3D;

    array3D.resize(HEIGHT);
    for (int i = 0; i < HEIGHT; ++i) {
        array3D[i].resize(WIDTH);
        for (int j = 0; j < WIDTH; ++j)
            array3D[i][j].resize(DEPTH);
        }

    return 0;
}

这种方法的好处是不用自己手动释放内存,而且数组大小可以动态变化(不过通常我们使用多维数组时不会变化它的大小)。
缺点是比较丑陋,一串vector会很长,尤其是> >不能连在一起否则编译器会认为是移位或者流提取运算符,尽管在c++11中可以连在一起写了。

指针

int main() {
    // construct p2DArray[HEIGHT][WIDTH]
    double **p2DArray;

    p2DArray = new double*[HEIGHT];
    for (int i = 0; i < HEIGHT; ++i)
        p2DArray[i] = new double[WIDTH];

    for (int i = 0; i < HEIGHT; ++i)
        delete [] p2DArray[i];
    delete [] p2DArray;


    // construct p3DArray[HEIGHT][WIDTH][DEPTH]
    int ***p3DArray;

    p3DArray = new int**[HEIGHT];
    for (int i = 0; i < HEIGHT; i++) {
        p3DArray[i] = new int*[WIDTH];
        for (int j = 0; j < WIDTH;j++) {
            p3DArray[i][j] = new int[DEPTH];
        }
    }

    for (int i = 0; i < HEIGHT; ++i) {
        for (int j = 0; j < WIDTH; ++j) {
            delete [] p3DArray[i][j];
        }
        delete [] p3DArray[i];
    }
    delete [] p3DArray;
}

这样的数组简洁明了,但要自己手动释放内存, 顺序还不能错,比较容易出问题。

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
4年前
STL不同容器的使用方法
以下内容摘自:http://blog.csdn.net/u014465639/article/details/70241850 1、vector(需要导入头文件include<vector)    ①定义与初始化       如果没有指定元素的初始化
伊丽莎白-简 伊丽莎白-简
5年前
Go 框架解析 -iris_一个北漂的程序猿
文章目录前言(about:blank_1)安装(about:blank_6)iris的生命周期(about:blankiris_32)关键代码解析(about:blank_53)结语(about:blank_268)文献(about:blank_272)(https://blo
Stella981 Stella981
4年前
C++中vector的使用
在c中,vector是一个十分有用的容器。作用:它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。vector在C标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类(https://www.oschina.net/action/GoToLink?url
Stella981 Stella981
4年前
Python基础教程,Python入门教程(非常详细)
<divclass"htmledit\_views"id"content\_views"<p<ahref"http://c.biancheng.net/python/base/"rel"nofollow"第1章Python编程基础</a</p<p1.<ahref"http://c.biancheng.net/view/
Wesley13 Wesley13
4年前
C++:模板类
22.模板类22.1模板类模板是泛型编程的基础,那什么是泛型编程呢?泛型编程是一种独立于任何特定数据类型编写代码的方式。C标准模板库中的数据容器、迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。比如动态数组vector是可以存放任何类型数据的容器,我们可以定义许多不同类型的vector,比如vector<int或vect
Stella981 Stella981
4年前
C++ STL Vector
前言vector,是C中的向量,也可以把他理解成为一个可变数组。熟练的应用好vector,可以提高算法设计的速度。在使用vector前,请先添加头文件。include<vectorvector的初始化vector<inta(10);//创建一个含是个元素的向量,元素值未知
Stella981 Stella981
4年前
CodeBlocks下载与安装教程
<divclass"htmledit\_views"id"content\_views"<p一、下载教程</p<p1.在浏览器上搜索CodeBlocks官网或者直接输入网址<ahref"http://www.codeblocks.org/"rel"nofollow"http://www.codeblocks.org/进入Co
Stella981 Stella981
4年前
C++vector,stack,queue,deque, list基本使用
vector初始化  (1)vector<inta(10);//定义了10个整型元素的向量(尖括号中为元素类型名,它可以是任何合法的数据类型),但没有给出初值,其值是不确定的。  (2)vector<inta(10,1);//定义了10个整型元素的向量,且给出每个元素的初值为1  (3)vector
Stella981 Stella981
4年前
Android C、C++与java端3DES互通
<divid"article\_content"class"article\_contentclearfix"<divclass"articlecopyright"<spanclass"creativecommons"<arel"license"href"http://creativecommons.org/licen
Stella981 Stella981
4年前
Elasticsearch源码导入IDEA
<divid"article\_content"class"article\_contentclearfix"<divclass"articlecopyright"<spanclass"creativecommons"<arel"license"href"http://creativecommons.org/licen
linbojue linbojue
1年前
【C++】vector容器初步模拟
今天我我来进行vector的模拟实现,先简单的实现一下初步功能,使其对内置类型可以适配。(大部分与string很类似)1认识vector开始了解vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着