C ++动态大小数组

时间:2012-11-24 15:11:55

标签: c++ arrays char

我需要你对C /С++数组的帮助。我已经用Python编程了三年,它的数组(称为list)很容易使用。

>>> array = [1,2,3,4]
>>> array.append(5)
>>> array
[1,2,3,4,5]

正如我在C / C ++中读到的,我需要创建一个指向数组的指针。请你做一个包含char数组的类的小草图,只有一个方法追加,称为append并接收char作为参数。此方法将数组大小增加1,并将给定的char添加到此数组。

有人可能认为这是一个功课,但我无法理解数组,指针和内存分配如何工作的原理。我想这并不难,但它是在像Python这样的语言之后发生的,因为我并不关心Python中的这些东西。请问您能提供一小段代码并附上解释吗?

提前致谢!

5 个答案:

答案 0 :(得分:5)

这是一个标准的C ++程序:

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> array = {1, 2, 3, 4};
    array.push_back( 5 );

    for( auto const item : array )
    {
        cout << item << " ";
    }
    cout << endl;
}

特定于Visual C ++。

即使是最新版本的Microsoft Visual C ++,即November 2012 CTP,它是版本11.0,带有一系列支持C ++ 11标准的修复程序,它还不支持上面使用的一般初始化。

使用Visual C ++,就像在C ++ 03中一样,这种表示法仅支持所谓的聚合类型,它基本上是纯原始数组或纯原始结构(可能包含更多C ++'ish)类型)或内置类型。因此,使用Visual C ++,一种方法是使用该符号表示原始数组,然后使用该原始数组初始化vector

#include <iostream>
#include <iterator>     // std::begin, std:.end
#include <vector>
using namespace std;

int main()
{
    int const   data[]  = {1, 2, 3, 4};
    vector<int> array( begin( data ), end( data ) );
    array.push_back( 5 );

    for( auto const item : array )
    {
        cout << item << " ";
    }
    cout << endl;
}

这也适用于Visual Studio 2012附带的Visual C ++ 11.0基础版。

但是,基于范围的for循环可能无法使用Visual C ++ 10.0(对应于Visual Studio 2010)进行编译。

答案 1 :(得分:1)

C和C ++是不同的语言。

在现代C ++中,您经常不使用原始数组,但是std::vector为您提供push_back成员函数。

答案 2 :(得分:1)

在C ++中,通常从不使用原始(C风格)数组,而是使用std::vector(动态大小)或std::array(固定大小,在C ++ 11中)等容器。通过这些实现,您的array类是直接的(您没有指定访问元素的方法,因此非常不可用)。

class array {
    std::vector<char> v_;
  public:
    void append(char c) {
      v_.push_back(c);
    }
};

答案 3 :(得分:0)

数组不能改变大小。但是,您可以在C ++中使用列表

http://www.cplusplus.com/reference/list/list/

答案 4 :(得分:0)

C和C ++中的术语数组用于表示包含相同类型的一个或多个数据元素的连续内存块。

有两种类型的数组:静态数组和动态数组。当程序编译并存储在程序的数据段中时,静态数组在内存中分配。顾名思义,动态数组是在运行时从堆中分配的(用于访问程序可用于内存的动态分配的数据结构)。

使用指针和索引器([]运算符)以相同的方式访问两种数组类型。

在C和C ++中,指针都是指向内存中某个位置的变量。它指向的内存可能包含类或基本数据类型。

静态数组和动态数组之间存在差异。以下是重要的内容:

  1. 必须分配动态数组才能使用它们并释放以防止内存泄漏
  2. 静态数组无法调整大小
  3. 在C语言中,您使用malloc分配内存并使用free释放内存。您可以使用realloc

    调整其大小

    在C ++中,您使用new分配内存并使用delete释放内存。你必须编写自己的代码来调整它的大小。

    对于大多数用途,C ++中的动态数组将使用std::vector实现。在C中如果你想要这样一种机制,你将不得不自己动手。你从 @Cheers和hth得到了一个很好的答案。 - std::vector上的Alf

    我不认为这是在C或C ++中编写动态内存的完整教程的地方。您可以从http://www.cplusplus.com/doc/tutorial/dynamic/

    获得一个很好的介绍

    然而,这是一个示例代码,它将向您展示如何在C中执行您想要的操作。对于C ++,请使用std::vector

    /*
    C CODE
    */
    
    #include <stdlib.h>
    #include <limits.h>
    
    typedef struct DARRAY dynamic_int_array_t;
    
    typedef struct DARRAY
    {
        int length;
        int *data;
        void (*alloc)(dynamic_int_array_t * the_array, int length);/*allocate*/
        void (*free)(dynamic_int_array_t * the_array);/*free*/
        void (*resize)(dynamic_int_array_t * the_array, int new_length);/*resize*/
        void (*append)(dynamic_int_array_t * the_array, int new_value);
        int (*get_at)(dynamic_int_array_t * the_array, int pos);/*use 1 based index getter*/
        void (*set_at)(dynamic_int_array_t * the_array, int pos, int value);/*use 1 based index setter*/
    }dynamic_int_array_t;
    
    void allocIntArray(dynamic_int_array_t * the_array, int length)
    {
        /*
        Allocate memory to contain length number of integers
        */
        the_array->data = (int*)malloc(length*sizeof(int));
        the_array->length = length;
    }
    
    void freeIntArray(dynamic_int_array_t * the_array)
    {
        if(NULL != the_array->data)
            free(the_array->data);/*Free the memory*/
        the_array->length = 0;/*Reset the length of the array*/
    }
    
    void resizeIntArray(dynamic_int_array_t * the_array, int new_length)
    {
        if(NULL != the_array->data && the_array->length > 0 && new_length >= 0)
        {
    
            if(new_length == 0)/*Free the array if a value of 0 was requested*/
                the_array->free(the_array);
            else
            {
                /*Resize the memory block*/
                the_array->data = (int*)realloc(the_array->data, new_length*sizeof(int));
            }
            the_array->length = new_length;
        }
    }
    
    void appendIntArray(dynamic_int_array_t * the_array, int new_value)
    {   
        the_array->resize(the_array, the_array->length + 1);
        the_array->data[the_array->length - 1] = new_value;
    }
    
    int getAt(dynamic_int_array_t * the_array, int pos)
    {
        if(NULL != the_array->data && pos > 0 && pos <= the_array->length)
            return the_array->data[pos-1];
        return INT_MIN;/*use INT_MIN to indicate error*/
    }
    
    void setAt(dynamic_int_array_t * the_array, int pos, int value)
    {
        if(NULL != the_array->data && pos > 0 && pos <= the_array->length)
            the_array->data[pos-1] = value;
    }
    
    int main(int argc, char **argv)
    {
        dynamic_int_array_t int_array = 
        {
            0,
            NULL,
            allocIntArray,
            freeIntArray,
            resizeIntArray,
            appendIntArray,
            getAt,
            setAt       
        };
    
        int_array.alloc(&int_array, 4);
        int_array.data[0] = 1, int_array.data[1] = 2,
            int_array.data[2] = 3, int_array.data[3] = 4;
        printf("array length: %d, last member: %d\n", int_array.length, int_array.get_at(&int_array,4));
        int_array.resize(&int_array, 5);
        int_array.data[4] = 5;/* can also use int_array.set_at(&int_array,5) = 5; */
        printf("array length: %d, last member: %d\n", int_array.length, int_array.get_at(&int_array,5));
        int_array.append(&int_array, 6);
        printf("array length: %d, last member: %d\n", int_array.length, int_array.get_at(&int_array,5));
    }