返回多个值的函数
Posted
技术标签:
【中文标题】返回多个值的函数【英文标题】:Function that returns multiple values 【发布时间】:2017-05-11 07:08:10 【问题描述】:我想问一下这里是否有人在 VC++ 上尝试过返回多个数据或值的函数。我想在对字符串进行标记后存储值。示例值为 00:00-10:00,11:00-14:00,16:00-21:00。如您所见,时间由逗号 (,) 分隔的 3 个部分分隔。使用strtok,我可以分离字符串。
char *token = strtok(stringabove,",");
while(token)
separatedvalues = token;
token = strtok(NULL,",");
return(separatedvalues);
使用向量编码。
vector<CString> MyFunction::Scheduler(CString value)
char temp[250];
sprintf(temp,"%s",value);
vector<CString> result;
char *token = strtok(temp,",");
while(token)
result.push(token;
token = strtok(NULL,",");
return(result);
我希望有人能帮我解决这个问题。
非常感谢。
【问题讨论】:
您需要详细说明您的问题。就目前而言,很难理解您想要什么。 可以使用结构、容器或元组,而不仅仅是单独的值。 通常,您会创建一个class
来封装此类数据,并返回它的一个实例(这种方式最适合扩展)。这些天的流行趋势喜欢元组,但不要仅仅因为它们是一个新的闪亮特性而使用它们。
确实,使用元组的好处是无穷无尽的。如果您想将代码提交给混淆竞赛,那么您需要做的重构也更少。
@Bathsheba:它是 "Qt" 和小写 "t"。它没有什么酷的。只有一个更大的社区在大声喊叫,这是自切片面包以来最好的。说实话:不是。它和 MFC 一样复杂,但优势在于它可以在更多平台上失败。
【参考方案1】:
C 和 C++ 不支持返回多个值。 但是,它们组合在一起时可以返回。
组合它们的一种方法是使用不同的变量创建结构。
struct Result
std::string res1;
std::string res2;
std::string res3;
;
当然,结果可以有不同的类型,但这是问题的结果。
因此,在这种情况下,您不会在循环中进行标记化,而是一个接一个地检查结果是否有效
Result splitTimeString(const std::string& input)
Result res;
// do the tokenizing and fill the result
return res;
用法:
Result res = splitTimeString(inp);
std::cout << res.res1;
如果您事先不知道结果的数量,但它们具有相同的类型,则可以使用容器(例如std::vector
)而不是结构。
您也可以使用 std::tuple 或 std::pair(有时被视为惰性程序员的结构)来代替结构,但这样做的好处是使用 std::tie
直接分配给单独的变量:
std::tuple<std::string, std::string, std::string> splitTimeStringToTuple(const std::String& inp)
std::string res1, res2, res3;
// tokenize
return std::make_tuple(res1, res2, res3);
std::string res1, res2, res3;
std::tie(res1, res2, res3) = splitTimeStringToTuple(inp);
【讨论】:
我尝试使用矢量,但它不起作用。请看上面的更新代码,我只是从网上的一个例子中修改的 @batch1999 它不起作用不是问题描述。 抱歉,我不知道CString
是什么,所以我无法帮助您。我确信使用std::vector<std::string>
和result.emplace_back(token);
会起作用。
@MichaelWalz 我的意思是它显示了整个值,即使我使用了 strtok,当我调用函数并使用迭代器显示结果时,它显示的是整个值而不是标记化的值。
实际上从 c++17 开始,您可以以元组的形式返回多个值【参考方案2】:
你可能想要这样的东西:
vector<CString> Test(CString value)
char temp[250];
sprintf(temp, "%s", value);
vector<CString> result;
char *token = strtok(temp, ",");
while (token)
result.push_back(CString(token)); // We need to push a CString not a char*
token = strtok_s(NULL, ",");
return(result);
int main()
CString value = "ab,cd,ef";
vector<CString> result = Test(value);
...
还有更优雅、更有效的方法,但这接近你的尝试。
否则效率会更高(请参阅下面 Joe Willcoxson 的评论):
void Test(CString value, vector<CString> & result)
char temp[250];
sprintf(temp, "%s", value);
char *token = strtok(temp, ",");
while (token)
result.push_back(CString(token)); // We need to push a CString not a char*
token = strtok_s(NULL, ",");
int main()
CString value = "ab,cd,ef";
vector<CString> result;
Test(value, result);
...
【讨论】:
谢谢...我会试试的。 是的,这就是他的要求。我会将函数设为 void 或 bool 并传入 vectorstd::vector
会将内容移动回调用者,而不是复制它们。这是一种保证,而不仅仅是编译器优化(参见this Q&A)。以上是关于返回多个值的函数的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin 协程Flow 异步流 ① ( 以异步返回返回多个返回值 | 同步调用返回多个值的弊端 | 尝试在 sequence 中调用挂起函数返回多个返回值 | 协程中调用挂起函数返回集合 )
Kotlin 协程Flow 异步流 ① ( 以异步返回返回多个返回值 | 同步调用返回多个值的弊端 | 尝试在 sequence 中调用挂起函数返回多个返回值 | 协程中调用挂起函数返回集合 )