【问题标题】:C++ dynamic size array [closed]C ++动态大小数组[关闭]
【发布时间】:2012-11-24 15:11:55
【问题描述】:

我在 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 中的这些东西。能否请您提供一小段代码并进行解释?

提前致谢!

【问题讨论】:

  • 查找 std::string 以获取字符数组。 cplusplus.com/reference/string/string
  • “我想这并不难,但在 Python 这样的语言之后就很难了,因为我不关心 Python 中的这些事情。” - 我被冷落并被告知 C 作为第一种编程语言并不好......
  • 第一步:停止谈论 C/C++。没有这样的事情。你要么用 C 编码,要么用 C++ 编码。 C++ 有很多可以使用的标准容器。
  • @Mat: “你要么用 C 编码,要么用 C++ 编码。” -- 这不是真的。您可以同时在两者中编码。事实上,有许多非常流行的库是为了能够同时编译为 C 和 C++ 而编写的。因此,您可以将 C/C++ 视为两种语言的交集。
  • @BenjaminLindley 这并不意味着 C 和 C++ 不是两种不同(且不可互换)的语言。

标签: c++ arrays char


【解决方案1】:

这是一个标准的 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)进行编译。

【讨论】:

  • 向量的列表初始化器仅适用于 C++11
  • @SebastianCabot ...自动循环和基于范围的循环也是如此。不过还是标准的。 :-)
  • @SebastianCabot:C++11 是当前的 C++ 标准。
  • @HostileFork 和作者:我很清楚这是最新的标准,因为你们两个都清楚没有一个编译器可以完整地实现它。 GCC 很接近,但即使是 GCC 也没有全部实现。我看到你已经编辑了你的答案。好 - 现在我可以投票了。虽然你让他的生活变得轻松。当您不知道常规数组的工作原理时,建议使用 vector 真的很糟糕。
  • 在您自己编写编译器之前,您不是真正的 C++ 程序员,只使用字母“o”。 search.dilbert.com/comic/We%20Didn't%20Have%20Zeros
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    在 C++ 中,通常从不使用原始(C 风格)数组,而是使用像 std::vector(动态大小)或 std::array(固定大小,在 C++11 中)这样的容器。有了这些实现你的array 类是直截了当的(虽然你没有指定访问元素的方法,所以非常不可用)。

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 列表不使用连续内存。虽然其他语言可能会使用链表或其他方式实现“数组”,但std::vector 是更自然的 C++ 首选类,用于可以增长/缩小的“数组”,您也可以access them as if they were C arrays
      【解决方案5】:

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

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

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

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

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

      1. 必须分配动态数组以使用它们并释放它们以防止内存泄漏
      2. 静态数组无法调整大小

      在 C 中,您使用 malloc 分配内存并使用 free 释放它。你可以使用realloc调整它的大小

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

      在大多数情况下,C++ 中的动态数组将使用std::vector 来实现。在 C 中,如果你想要这样的机制,你将不得不自己动手。 @Cheers 和 hth 给了你一个很好的答案。 - 阿尔夫std::vector

      我认为这里不是用 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));
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-19
        • 1970-01-01
        • 2011-05-03
        • 1970-01-01
        • 1970-01-01
        • 2011-10-24
        • 2014-02-23
        相关资源
        最近更新 更多