精华内容
下载资源
问答
  • C++中vector多维数组初始化及清零

    20170601_C++中vector多维数组初始化及清零


    C++ vector多维数组初始化及清零

    http://www.cnblogs.com/wei-li/archive/2012/06/08/2541576.html


    展开全文
  • C++ vector多维数组初始化及清零

    千次阅读 2018-08-14 10:22:21
    C++ vector多维数组初始化及清零 ve c tor常用方法 assign() 对 Vector 中的元素赋值 void assign( input_iterator start, input_iterator end ); // void assign( size_type num, const TYPE &val ); ...
    原文地址为:C++ vector多维数组初始化及清零

    vector常用方法


    assign() 对Vector中的元素赋值

    void assign( input_iterator start, input_iterator end ); //
    void assign( size_type num, const TYPE &val );

    reserve() 设置Vector最小的元素容纳数量 函数为当前vector预留至少共容纳size个元素的空间.(译注:实际空间可能大于size)

    resize() 改变Vector元素数量的大小 函数改变当前vector的大小为size,且对新创建的元素赋值val

    swap() 交换两个Vector

    capacity() 返回vector所能容纳的元素数量(在不重新分配内存的情况下)

    max_size() 返回Vector所能容纳元素数量的最大值(译注:包括可重新分配内存).

    size() 返回Vector元素数量的大小

    get_allocator() 返回vector的内存分配器 

    http://blog.csdn.net/qingqinglanghua/article/details/5035763

     

    初始化及清零


    定义空二维vector,再赋值
    vector<vector <int> > ivec(m ,vector<int>(n)); //m*n的二维vector,注意两个 "> "之间要有空格!

    void assign(const_iterator first, const_iterator last);

    void assign( size_type _Count, const Type& _Val ); // 赋值,用指定元素序列替换容器内所有元素

    定义并初始化二维数组

    vector<vector <int> > ivec(m ,vector<int>(n,0)); //m*n的二维vector,所有元素初始化为0

    vector<string> v1;         // 创建空容器,其对象类型为string类
    vector<string> v2(10);     // 创建有10个具有初始值(即空串)的string类对象的容器
    vector<string> v3(5, "hello"); // 创建有5个值为“hello”的string类对象的容器
    vector<string> v4(v3.begin(), v3.end());  // v4是与v3相同的容器(完全复制)

    使用STL vector的几种清空容器(删除)办法

    iterator erase(iterator it); // 删除指定元素,并返回删除元素后一个元素的位置(如果无元素,返回end())
    iterator erase(iterator first, iterator last); // 注意:删除元素后,删除点之后的元素对应的迭代器不再有效。

    void clear() const; // 函数删除当前vector中的所有元素,相当于调用erase( begin(), end())

    http://hi.baidu.com/ljjyxz123/blog/item/c3bab7f50aabbc05bd31096e.html

     

    assign和resize


    template <class InputIterator>
    void assign ( InputIterator first, InputIterator last );
    void assign ( size_type n, const T& u );

    assign() 函数要么将区间[first, last)的元素赋到当前vector,或者赋n个值为u的元素到vector中.这个函数将会清除掉为vector赋值以前的内容.

    注意:assign操作首先删除vector容器内的所有元素,然后将参数指定的新元素插入到该容器中。

    参数

    first, last

    标记一段范围的一对迭代器,即将[first,last)标记范围内所有元素复制到当前的vector中.包含first所指向的元素,不包含last所指向的元素。

    n,u

    表示将当前vector中重新设置为存储n个值为t的元素

     

    void resize ( size_type sz, T c = T() );

    改变长度

    把当前 vector容器的的长度大小重设为sz
    如果sz小于当前vector容器的size,则删除多出来的元素,否则采用值为 T 来初始化新添加的元素

    参数

    sz

    要设置当前vector的size的值
    Member type size_type is an unsigned integral type.

    c

    用初始化的新添加的元素的值。

    可为空,为空则表示采用值初始化来初始化新添加的元素

     

    resize函数有2个重载版本,一个只有一个size_type参数,一个除了size_type参数外还有_Ty _val,即“可选”新元素值。

    先说第一个版本:

    void resize(size_type _Newsize)
    { // determine new length, padding with _Ty() elements as needed
    resize(_Newsize, _Ty());
    }

    可见它用_Ty()做第2个参数,调用了它的第2个版本。第2个版本的定义如下:

    void resize(size_type _Newsize, _Ty _Val)
    { // determine new length, padding with _Val elements as needed
    if (size() < _Newsize)
    _Insert_n(end(), _Newsize - size(), _Val);
    else if (_Newsize < size())
    erase(begin() + _Newsize, end());
    }

    由定义可知,对于第一个版本:

    若_Newsize小于oldsize,则剩余元素值不变。

    若_Newsize大于oldsize,则新添加的元素值用元素的默认构造参数初始化(特别的,int型的将被初始化为0)。

    对于第2个版本:

    若_Newsize小于oldsize,则剩余元素值不变。(全部调用erase(begin() + _Newsize, end())擦除掉多余元素)

    若_Newsize大于oldsize,则新添加的元素值用提供的第2个参数初始化。

    不管用哪个版本,[0,min(_Newsize,oldsize))范围内的值均保持不变。

     

    capcity和size


    CAPCITY是此容器当前可以容纳的最大元素个数,就是不用重新分配内存是可以容纳的个数
    SIZE是现在容器中已经存在的元素个数
    所以容量>=长度

    vector <int> a(10);
    a.push_back(1);
    此时a.size()=1,a.capacity()=10

     

    reverse和resize


    vector 的reverse只是增加了vector的capacity,但是size没有改变!
    resize同时改变了vector的capacity和size!

    reserve是容器预留空间,但并不真正创建元素对象,在创建对象之前,不能引用容器内的元素,因此当加入新的元素时,需要用push_back()/insert()函数。

    resize是改变容器的大小,并且创建对象,因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。

    再者,两个函数的形式是有区别的,reserve函数之后一个参数,即需要预留的容器的空间;resize函数可以有两个参数,第一个参数是容器新的大小,第二个参数是要加入容器中的新元素,如果这个参数被省略,那么就调用元素对象的默认构造函数。

    vector<int> myVec; 
    myVec.reserve( 100 );     // 新元素还没有构造, 
                              // 此时不能用[]访问元素 
    for (int i = 0; i < 100; i++ ) 
    { 
         myVec.push_back( i ); //新元素这时才构造 
    } 
    myVec.resize( 102 );      // 用元素的默认构造函数构造了两个新的元素 
    myVec[100] = 1;           //直接操作新元素 
    myVec[101] = 2;  

    为实现resize的语义,resize接口做了两个保证:
    一是保证区间[0, new_size)范围内数据有效,如果下标index在此区间内,vector[indext]是合法的。
    二是保证区间[0, new_size)范围以外数据无效,如果下标index在区间外,vector[indext]是非法的。


    reserve只是保证vector的空间大小(capacity)最少达到它的参数所指定的大小n。在区间[0, n)范围内,如果下标是index,vector[index]这种访问有可能是合法的,也有可能是非法的,视具体情况而定。


    resize和reserve接口的共同点是它们都保证了vector的空间大小(capacity)最少达到它的参数所指定的大小。

    http://blog.sina.com.cn/s/blog_749f55cd0100p5qw.html

    http://bbs.bccn.net/thread-91130-1-1.html

     

    vector list 赋值速度比较


    v2 = v1;//用赋值操作符赋值vector()(3rd)

    l2 = l1;//用赋值操作符赋值list

    v2.assign(v1.begin(), v1.end());//用assign给vector赋值(1st)

    l2.assign(l1.begin(), l1.end());//用assign给list赋值

    copy(v1.begin(), v1.end(), inserter(v2, v2.begin()));//用copy算法给vector赋值(插入迭代器方式)(5nd)

    copy(l1.begin(), l1.end(), inserter(l2, l2.begin()));//用copy算法给list赋值(插入迭代器方式)

    v2.resize(v1.size());

    copy(v1.begin(), v1.end(), v2.begin());//用copy算法给vector赋值(resize)(2nd)

    l2.resize(l1.size());

    copy(l1.begin(), l1.end(), l2.begin());//用copy算法给list赋值(resize)

    v2.assign(l1.begin(), l1.end());//用assign给vector赋值(从list)(4st)

    l2.assign(v1.begin(), v1.end());//用assign给list赋值(从vector)

    总结:
    vector:对于vector赋值方式中,assign的速度是最快的,其次是resize以后用copy算法赋值,而最先能够想到的赋值操作符,速度却并不快,只能够排名第三,目前还不知道这是为什么,采用插入迭代器再用copy的方式是速度最慢的一种。
    list:对于list赋值,赋值操作符的速度是最快的,其次是assign,然后是采用resize的copy,最后一位同样是采用插入迭代子方式的copy。


    转载请注明本文地址:C++ vector多维数组初始化及清零
    展开全文
  • C++语言 的 C++多维数组...C++多维数组示例下面来看看一个C++中的多维数组的简单例子,它声明,初始化和遍历二维数组。#include using namespace std;int main(){int test[3][3]; //declaration of 2D arraytest[0...

    C++语言 的 C++多维数组

    多维数组也称为C++中的矩形数组。 它可以是二维或三维的。 数据以表格形式(行*列)存储,也称为矩阵。

    C++多维数组示例

    下面来看看一个C++中的多维数组的简单例子,它声明,初始化和遍历二维数组。

    #include

    using namespace std;

    int main()

    {

    int test[3][3]; //declaration of 2D array

    test[0][0]=5; //initialization

    test[0][1]=10;

    test[1][1]=15;

    test[1][2]=20;

    test[2][0]=30;

    test[2][2]=10;

    //traversal

    for(int i = 0; i < 3; ++i)

    {

    for(int j = 0; j < 3; ++j)

    {

    cout<< test[i][j]<

    }

    cout<

    }

    return 0;

    }

    执行以上代码,得到以下结果 -

    5 10 0

    0 15 20

    30 0 10

    C++多维数组示例:同时声明并初始化

    下面来看看一个在声明时初始化数组的多维数组的简单例子。

    #include

    using namespace std;

    int main()

    {

    int test[3][3] =

    {

    {2, 5, 5},

    {4, 0, 3},

    {9, 1, 8} }; //declaration and initialization

    //traversal

    for(int i = 0; i < 3; ++i)

    {

    for(int j = 0; j < 3; ++j)

    {

    cout<< test[i][j]<

    }

    cout<

    }

    return 0;

    }

    执行以上代码,得到以下结果 -

    2 5 5

    4 0 3

    9 1 8

    展开全文
  • 使用范围for + auto是一种比较方便的方法来遍历多维数组,只需要知道有多少个维度,再建立多少个循环即可。关键是不容易写错。 ...

    多维数组初始化

    • int arr[2][3],一般在函数体中使用,所以是在栈中分配内存的局部变量,未初始化时内存上存的是0xCCCCCCCC,它的补码数即为-858993460。
    • int arr[2][3] = {0},为第一个元素赋值为0,其余元素由于没给值,所以也赋值为0.
    • int arr[2][3] = {1},为第一个元素赋值为1,其余元素由于没给值,所以赋值为0.
    • int arr[2][3] = {1,2,3,4},为前4个元素依次赋值为这些。(相当于把所有元素展开来数前4个)其余为0.
    • int arr[2][3] = { {1}, {2} },为每一行的首元素赋值。注意里面大括号的个数不能大于第一维度的大小。其余为0.
    • int arr[2][3] = { {1,2,3}, {4,5,6} },这是最完整的赋值。

    使用下标 遍历

    int ia[3][4] = {1,2,3,4,5,6,7,8};
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            cout << ia[i][j] << endl;
        }
    }
    

    很常用的方式,既可以打印,也可以赋值。

    使用范围for + auto遍历

    for (auto &p : ia)
    {
        for (auto q : p)
        {
            cout << q << endl;
        }
    }
    

    只可以打印。上面的q是个局部变量,修改值不会影响到数组中的元素。

    for (auto &p : ia)
    {
        for (auto &q : p)
        {
            cout << q << endl;
        }
    }
    

    既可以打印,也可以赋值。上面的q是个引用,绑定在数组的各个元素上的,修改值自然会影响到数组中的元素。

    for (auto p : ia)//此处有错,p被转换为指针
    {
        for (auto q : p)
        {
            cout << q << endl;
        }
    }
    

    上面代码有错,p被转换为指针(其类型为int(*)[4]),而在内循环中一个指针自然是不可以范围for的,所以会报错。所以要使用范围for + auto,至少最里循环以外的所有循环都用的引用,才能正常遍历。如果还想对元素赋值,则最里循环也得使用引用。

    for (int (&p)[4] : ia)
    {
        for (int q : p)
        {
            cout << q << endl;
        }
    }
    

    这是第一段代码它原来的样子。

    总结:使用范围for + auto是一种比较方便的方法来遍历多维数组,只需要知道有多少个维度,再建立多少个循环即可。关键是不容易写错。

    使用指针 + auto遍历

    int ia[3][4] = {1,2,3,4,5,6,7,8};
    
    for (auto p = ia; p != ia + 3; p++)
    {
        for (auto q = *p; q != *p + 4; q++)
        {
            cout << *q << endl;
        }
    }
    

    既可以打印,也可以赋值。上面的q是个int型指针,对指针解引用自然可以赋值。

    int ia[3][4][5] = { 1,2,3,4,5,6 };
    	
    for (auto p = ia; p != ia + 3; p++)
    {
    	for (auto q = *p; q != *p + 4; q++)
    	{
    		for (auto t = *q; t != *q + 5; t++) {
    			cout << *t << endl;
    			*t = 10;
    		}	
    	}
    }
    

    注意多维数组如果是2维以上,写法应该是这样的。除最外层循环外,其余循环都得对指针解引用。

    • 第二个循环里,p是个int (*)[4][5]指针(因为这个多维数组的每个元素是int [4][5]数组,执行auto p = ia后,数组名ia转换为指向其首元素的指针)
    • p解引用后,*p是个数组名,其每个元素为int [5]数组,执行auto q = *p后,q则为int (*)[5]指针。

    可见即使使用了auto关键字,这段代码也很容易写错,比如for循环的循环条件那里。

    for (auto p = begin(ia); p != end(ia); p++)
    {
        for (auto q = begin(*p); q != end(*p); q++)
        {
            cout << *q << endl;
        }
    }
    

    使用begin和end就可以避免循环条件那里写错了。注意参数需是数组名哈。

    for (int(*p)[4] = ia; p != ia + 3; p++)
    {
        for (int* q = *p; q != *p + 4; q++)
        {
            cout << *q << endl;
        }
    }
    

    这是第一段代码它原来的样子。

    使用类型别名替换auto遍历

    typedef int int_array[4];
    using int_array = int[4];//两种方式
    
    //在指针 + auto中,将auto进行替换
    for (int_array* p = ia; p != ia + 3; p++)
    {
        for (int* q = *p; q != *p + 4; q++)
        {
            cout << *q << endl;
        }
    }
    
    //在范围for + auto中,将auto进行替换
    for (int_array &p : ia)
    {
        for (int q : p)
        {
            cout << q << endl;
        }
    }
    

    将循环变量的类型指定为类型别名,很花哨,但不实用。

    展开全文
  • C语言多维数组初始化

    千次阅读 2019-05-28 13:41:00
    由于剧情,需要C语言实现图像算法。但作为一名MATLAB老用户,根本不知“指针”“内存”为何物。开始自信满满,结果连初始化一个二维全零矩阵都不会(尴尬)。 顾从零学起,在此总结,供跟我一样的选手学习交流。
  • c++多维数组

    2016-11-18 21:46:58
    c++支持多维数组多维数组的声明的一般形式如下: type name [size1][size2]...[sizeN]; 例如,下面的声明创建了一个三位5.10.4整型数组: int threedim [5] [10] [4]; 二维数组 多维数组最简单的形式是二维数组...
  • C++多维数组

    2019-04-22 14:19:04
    参考自:Primer C++ 第五版 严格的讲,C++没有多维数组,通常所说的多维数组其实是数组的数组。 当一个数组的元素依然是数组时,通常使用两个...多维数组初始化: int a[3][4] = { {0,1,2,3},//初始化第一行 {4...
  • 在刷LeetCode时,使用数组经常发生意料之外的bug,查找原因之后,发现是以为默认初始化数组,其实并没有初始化,所以下面叫一下数组的定义及初始化。 转载自:https://www.cnblogs.com/haoyijing/p/5815035.html ...
  • [C++]数组初始化

    2017-10-13 17:49:58
    此 new 表达式分配了一个含有 10 个 int 型元素的数组,并返回指向该数组第一个元素的指针,此返回值初始化了指针 pia。 在自由存储区中创建的数组对象是没有名字的,只能通过其地址间接地访问堆中的对象。 ...
  • C++多维数组形参

    千次阅读 2016-05-13 22:14:30
    需求今天在学习数据结构和算法时遇到一个需要传递多维数组形参的问题。问题本身很简单,向方法传递一个二维数组,但是使用的时候为了能够让数组维度值能够动态可变(比如向同一个方法传递3X3矩阵或者4X4矩阵),也...
  • 疫情所迫,希望用这种方法督促自己...一、多维数组初始化 对于一个3行4列的数组可以理解为由3个大小为4的数组所构成,多维数组既数组的数组。多维数组的定义如下: int a[3][4]; //定义大小为3 x 4的整型数组 in...
  • C++数组初始化

    千次阅读 2018-12-28 11:19:39
    C++数组初始化 定义: int *pia = new int[10]; // array of 10 uninitialized ints 此 new 表达式分配了一个含有 10 个 int 型元素的数组,并返回指向该数组第一个元素的指针,此返回值初始化了指针 pia...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,238
精华内容 5,295
关键字:

c++多维数组初始化

c++ 订阅