我正在编写一个带字符串,字符串指针和int的函数。 该函数根据一组规则拆分字符串,并将每个标记放入一个数组中。我需要使用int变量中的元素数量将函数返回到函数中。我不知道如何返回数组,因为我无法使用auto,因此它被销毁,我不愿意使用new作为我觉得这很不完整。
关于如何解决这个问题我还有其他想法,但我想先了解其他人如何解决这个问题。我也可能是错的,有可能将一个自动传递出一个数组。我也不能使用向量,所以有一个复制构造函数。
无法使用矢量,因为这是一个挑战,我被要求不使用模板。
答案 0 :(得分:2)
考虑到这些限制,这更多是C而不是C ++问题。
返回数组的常见C模式实际上是让调用者传入一个数组来填充。这使得调用者可以决定分配(从而解除分配)。
你的函数原型看起来像
int Function(string str1, string_ptr str2, int n, int* pOutArray, int cOutArray);
函数返回写入pOutArray的元素数。
在pOutArray处理为NULL的实现中,在这种情况下,你只计算元素的数量,然后返回。这使您可以根据需要以多种方式之一调用该函数: -
int out[5]={0};
int cFilled = Function(s1,s2,x,out,_countof(out));
// Further code can use up to 5<cFilled elements from the array.
,或者
int cElt = Function(s1,s2,x,NULL,0);
int* pOut = malloc(sizeof(int)*cElt);
Function(s1,s2,x,pOut,cElt);
// pOut now contains exactly the number of elements extracted.
free(pOut);
答案 1 :(得分:1)
自然选择 当然是将结果作为std::vector<std::string>
传递。如果您不想使用此方法,则有两种选择:
new
为结果分配空间,我认为这是一个更好,更强大的选择。您当然必须确保客户端稍后使用正确版本的delete
删除内存,或者提供一种特殊的机制来释放内存。答案 2 :(得分:0)
如果要返回固定大小的数组,可以使用boost::array。但是,如果您不想添加Boost依赖项,那么简单的解决方案是使用固定大小的数组创建数据结构,如:
template<typename T, std::size_t SIZE> struct array_wrapper { T array[SIZE]; };
如果大小可以改变,那么使用std::vector
确实最有意义。请记住,返回包装类(如上所述)仍将导致创建副本(尽管是由编译器创建的)。因此,通过按值传递大结果而不是在堆上构造并传递指向分配数据的指针,您实际上不会节省任何费用,因此您的要求没有意义。
答案 3 :(得分:0)
传入'char&amp; **'和'int&amp; *'参数并在那里分配令牌,让责任释放内存给调用者。 现代标准不太好,但有效。
答案 4 :(得分:0)
如果您选择不使用管理内存的标准方法(即std :: vector),那么您将不得不做出选择。
三个基本选项是:
选项(2)因某人需要释放内存而变得复杂。作为API的一部分,您需要指定函数是否以某种方式清除了以后(以及何时)阻塞,或者调用者是否负责。
选项(3)可能有点过分 - 你需要编写一个函数来调用main函数。
因此,选项(1)是您最好的(如果您不能使用向量)。这是一个非常标准的模式 - 例如,低级Windows API使用该模式。
基本上,必须将内存管理记录为API的一部分。