String [] decode(String message)
以上是一个例子。我需要获得2个字符串s1和s2作为解码函数的返回值。我该怎么办?
答案 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.html和http://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::pair
或std::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
}
参考后,您将防止不必要的复制。