C ++:结构和数组之间的相似之处?

时间:2017-01-30 04:29:41

标签: c++

C ++中的结构和数组之间是否有任何相似之处?

我想知道这样的问题,因为两者都是不同的,因为一个是用户定义的数据类型,另一个是具有连续内存位置存储的派生数据类型。

1 个答案:

答案 0 :(得分:3)

结构和数组有一些共同之处,但通常认为它们在概念上是分开的。您可能能够使用其中任何一种情况的一种情况是,如果要存储已知数量的所有相同类型的变量。

如果您存储的数据是一个系列,其中每个值在某些不同的上下文中具有相同的含义,我建议使用数组;如果每个值具有不同的含义,我建议使用结构。

E.g。

您希望存储一周的一系列最高温度值。每个值的含义都相同,都是最高温度,因此您使用数组:

std::array<int, 7> week_max_temperatures;

您希望存储一天的最高和最低温度以及总降雨量。每个值的类型相同,int,但含义不同,因此您使用结构来避免混淆最低温度,最高温度和降雨量:

struct DailyWeatherData
{
    int max_temperature_deg_c;
    int min_temperature_deg_c;
    int total_rainfall_mm;
};

以下列出了它们的相同点和不同点:

的Structs:

  • 数据成员可以是不同类型的组合,但成员的类型和数量在编译时是固定的。
  • 可以使用静态和实例方法。
  • 可以使用operator=()进行复制(除非通过复制构造函数删除或包含不可复制的成员禁止)。
  • 作为函数参数传递时复制(除非作为引用或指针传递)。
  • 数据存储在对象中。它们存储在内存中的位置取决于它们是定义为局部变量还是使用new分配。如果是后者那么你负责内存管理。

C风格的数组:

  • 可以包含任意数量的元素,所有元素都属于同一类型。类型在编译时设置,并且在运行时创建数组时设置元素数。
  • 无法使用与之关联的用户定义方法。
  • 是可复制的,但只能通过std::copymemcpy,而非operator=()
  • 作为函数参数传递时衰减为指针。
  • 数据存储在内存中取决于数组是创建为本地变量还是使用new[]分配。如果是后者那么你负责内存管理。在任何一种情况下,数组变量都像指向实际数据的指针一样。

std::array

  • 可以包含任意数量的元素,所有元素都属于同一类型。元素的类型和数量在编译时设置。
  • 不能使用与之关联的用户定义方法(忽略子类化)。
  • 可以使用operator=()进行复制。
  • 作为函数参数传递时复制(除非作为引用或指针传递)。
  • 数据存储在对象中。它们通常不使用new进行分配,因此内存管理不是问题。

std::vector

  • 可以包含任意数量的元素,所有元素都属于同一类型。类型在编译时设置,元素数量可以在运行时更改。
  • 不能使用与之关联的用户定义方法(忽略子类化)。
  • 可以使用operator=()进行复制。
  • 作为函数参数传递时复制(除非作为引用或指针传递)。
  • 数据存储在对象外部,并自动处理内存管理。