检索数组的最简洁方法是什么?

时间:2015-09-27 09:33:10

标签: c++ arrays

我需要一个返回任意长度的数据块(char *)的函数。函数的调用者既需要数组,也需要数组的大小。该数组可以在函数内动态分配,也可以作为参数传递。有多种方法可以达到相同的效果。现在我想知道什么被认为是用C ++做的最“干净”的方式。我将在下面举例说明。

返回数组,修改长度(作为参考):

char *getData( int &length ) {
  length = // set length
  char *data = new char[ length ];
  // fill data here
  return data;
}

返回长度,修改数组(作为参考):

int getData( char * &data ) {
  int length = // set length
  data = new char[ length ];
  // fill data here
  return length;
}

返回成功代码,修改数组和长度(作为参考)

bool getData( int &length, char * &data ) {
  int length = // set length
  data = new char[ length ];
  // fill data here
  return true; // Successful
}

填充提供的数组,返回完整长度(可能无法获取所有数据):

int getData( char *data, int maxLength ) {
  int length = // set length
  // fill data here, to max size of min( length, maxLength )
  return length;
}

甚至可能有更多的可能性,但是在C ++中这被认为是“最干净”的方式?

2 个答案:

答案 0 :(得分:2)

他们都不是。如果您正在使用C ++而不仅仅是C,请继续使用它提供的语义。

您真的想使用std::vector,特别是std::vector<char>。不要自己动手或处理C风格的东西,这是浪费时间。

答案 1 :(得分:1)

您有几种选择。正如评论者所提到的,大多数C ++方式都是使用标准容器。这就是他们的目的。这样,您还可以避免手动new数据导致的潜在内存泄漏。

std::vector<char> getData() {
  std::vector<char> res;
  // fill vector with data of your choosing using push_back etc.
  return res;
}

如果必须使用c样式数组,另一个选项是使用在GSL(指南支持库)下作为CppCoreGuidelines项目的一部分发布的新array_view类。

请参阅:https://github.com/Microsoft/GSL

并且:https://github.com/isocpp/CppCoreGuidelines

但是,我建议坚持使用std::vector,除非你有充分的理由(比如一个庞大的遗留代码库或与关键和不可更新的库互操作)来使用c风格的数组。