如何将'数组字符串'作为函数的返回类型?

时间:2009-06-14 12:41:33

标签: c++ function return-type

String [] decode(String message)

以上是一个例子。我需要获得2个字符串s1和s2作为解码函数的返回值。我该怎么办?

9 个答案:

答案 0 :(得分:6)

如果您需要返回少量字符串,请使用下一个字符串:
- std :: pair
- boost :: tuple
- 结构

如果您不知道函数将返回多少个字符串 - 请使用类似std :: vector。

的内容

答案 1 :(得分:4)

如果是我,我会返回vector string秒。使用阵列,您需要担心内存管理。如果您不想修改它,也可以将字符串作为const引用传递。

答案 2 :(得分:4)

我会说选项是:

对于固定数量的字符串:

1)返回你自己定义的一对,一个元组或一个结构。类似的东西:

struct BrokenDownString {
    std::string firstbit;
    std::string middlebit;
    std::string endbit;
};

然后:

BrokenDownString decode(std::string message);

或者只是给BrokenDownString一个构造函数,将消息作为参数。

2)通过指针或非常量引用获取多个参数:

void decode(const std::string &message, std::string &out_1, std::string &out_2) {
    out_1 = /*whatever*/;
    out_2 = /*whatever*/;
}

对于两个字符串,其他任何东西(甚至数组)都是过度的。

但是,对于可变数量的字符串,您可以:

1)返回std::vector<std::string>(请注意,这可能会导致过多的复制)。

2)将std::vector<std::string> &作为参数,并附加结果(这可能会复制字符串,但不能复制容器)。

3)使解码成为一个函数模板,将输出迭代器作为参数:

template<typename OUT>
void decode(const std::string message, OUT out) {
    // do parsing
    *(out++) = firstbit;
    *(out++) = nextbit;
    // etc.
}

然后,如果调用者想要将结果放在向量中:

std::vector<std::string> v;
decode(message, std::back_inserter(v));

如果来电者更喜欢他们的话:

std::deque<std::string> d;
decode(message, std::back_inserter(d));

如果调用者希望他们以相反的顺序列在列表中:

std::list<std::string> l;
decode(message, std::front_inserter(l));

等等。

4)如果您需要类似上述的内容,但无论出于何种原因您不想编写模板代码,请将解码视为对象的参数,并通知每个字符串:

struct DecodeTarget {
    virtual void append(const std::string &) = 0;
};

void decode(std::string message, DecodeTarget &out) {
    // do parsing
    out.append(firstbit);
    out.append(nextbit);
    // etc.
}

然后,如果调用者想要将结果放在向量中:

class VectorTarget : public DecodeTarget {
private:
    std::vector<std::string> &results;
public:
    VectorTarget(std::vector<std::string> &v) : results(v) { }
    void append(const std::string &bit) { v.push_back(bit); }
};

std::vector<std::string> v;
VectorTarget vt(v);
decode(message, vt);

答案 3 :(得分:1)

如果你感觉自己很难接受挑战,那么你可以归还一个角色。

但是,这非常容易出错,因此您应该坚持使用标准容器或字符串类。

答案 4 :(得分:1)

他们(Top Coder)是否提到了C字符串数组或std :: strings数组? 为了您的信息,数组是邪恶的(http://siddhant3s.googlepages.com/how_to_tell_rusted_cpp.htmlhttp://www.parashift.com/c++-faq-lite/containers.html#faq-34.1) 最近,如果你仍想返回std :: strings数组,你可以但只有当你答应我会相应地删除[]时返回指针:

#include<iostream>
#include<string>
std::string* F1()
{
    std::string* s=new std::string[2];
    s[0]="Hello";
    s[1]="World";
    return s;
}

int main()
{
    std::string* ss=F1();
    std::cout<<ss[0]<<ss[1];

    delete[] ss; //important step
}

答案 5 :(得分:1)

如果绝对必须返回数组,则可以使用原始数组衰减为指针的事实。这里有一些示例代码可以完成我想要的任务:

#include <iostream>
#include <ostream>
#include <string>

std::string * decode()
{
    std::string *ret = new std::string[2];
    ret[0] = "foo";
    ret[1] = "bar";
    return ret;
}

int main()
{
    std::string *baz = decode();
    std::cout << baz[0] << baz[1] << std::endl;
    delete [] baz;

    return 0;
}

请注意,这种方式要求您跟踪以下内容:

  • 谁拥有decode()
  • 返回的内存
  • 返回的指针实际上是一个数组
  • 数组的大小

是的,这很痛苦。这就是其他人建议使用std::pairstd::vector为您处理工作的原因。

答案 6 :(得分:0)

将字符串作为“out”参数传递给函数 - 通过指针或引用传递,并在函数内修改它们。

答案 7 :(得分:0)

对于这种特殊情况,我实际上不建议这样做,但是你可以将引用返回给字符串数组:

std::string(& split_once(std::string arg))[]
    static std::string result[2];
    int i = arg.find_first_of('|');
    result[0] = arg.substr(0,i);
    result[1] = arg.substr(i + 1);
}

这不适合这个特定的应用程序,但它返回数组的有效方法,在其他情况下很有用。我想我甚至在某个地方使用它,虽然我不记得在哪里或为什么。

答案 8 :(得分:0)

你可以:

返回std::vector<std::string>,返回std::pair<std::string, std::string>,返回带有字符串的结构,或者不返回,传递引用并设置它:

void decode(std::string & s1, std::string & s2, const std::string & otherParam) {
    // write the result to s1 and s2
}

参考后,您将防止不必要的复制。