c – 有没有理由将这两个函数合并为一个函数?
发布时间:2020-12-16 09:43:45 所属栏目:百科 来源:网络整理
导读:在c标签下投票最多的问题之一被称为 “Splitting a string in C++”.在其中,提问者问:“在C中拆分字符串最优雅的方式是什么?”. The highest voted answer到这个问题提供了这两个功能: std::vectorstd::string split(const std::string s,char delim,std:
在c标签下投票最多的问题之一被称为
“Splitting a string in C++”.在其中,提问者问:“在C中拆分字符串最优雅的方式是什么?”.
The highest voted answer到这个问题提供了这两个功能: std::vector<std::string> &split(const std::string &s,char delim,std::vector<std::string> &elems) { std::stringstream ss(s); std::string item; while (std::getline(ss,item,delim)) { elems.push_back(item); } return elems; } std::vector<std::string> split(const std::string &s,char delim) { std::vector<std::string> elems; return split(s,delim,elems); } 这些功能很棒.但我试图理解为什么回答者没有将这两个函数组合成一个函数.是否有一些性能,可用性或可读性的好处,我没有看到你在结合这些功能时错过了什么?具有组合功能的完整程序如下: #include <iostream> #include <vector> #include <string> #include <sstream> using namespace std; // splitting them into two seperate functions is unnecessary it seems to me,and makes the underlying function harder to understand. std::vector<std::string> split(const std::string &s,char delim) { std::vector<std::string> elems; std::stringstream ss(s); std::string item; while (std::getline(ss,delim)) { elems.push_back(item); } return elems; } int main() { std::vector<std::string> x = split("one:two::three",':'); for (int i = 0; i<x.size(); ++i) cout << x[i] << 'n'; return 0; } 我发现这个功能分裂得非常不优雅 – 而且更难理解 – 但我觉得我必须遗漏一些东西.他为什么不把它们组合起来? 解决方法
想象一下,你将分裂一堆不同的来源,但希望结果都以一个容器结束.为此,您不希望该函数始终为您分配新容器:
之前,需要额外的工作: std::vector<std::string> sources = /* populate */; std::vector<std::string> results; for (const auto& source : sources) { auto result = split(source,":"); // or maintain a vector of vectors...yuck results.insert(std::make_move_iterator(result.begin()),std::make_move_iterator(result.end())); } 之后,直截了当: std::vector<std::string> sources = /* populate */; std::vector<std::string> results; for (const auto& source : sources) { split(source,":",results); } 或者:想象一下你要拆分一堆差异源,为了提高效率,你希望最小化内存分配(例如,你的探查器说你在这里分配的太多了).因此,您反复重复使用相同的向量,以避免在第一次拆分后的后续内存分配. 以前,慢: std::vector<std::string> sources = /* populate */; for (const auto& source : sources) { auto result = split(source,":"); process(result); } 之后,更好: std::vector<std::string> sources = /* populate */; std::vector<std::string> result; for (const auto& source : sources) { result.clear(); split(source,result); process(result); } 当然,在一般情况下,为您创建容器的简单性很好,我们可以轻松地重用更通用的功能,以较低的成本创建第二个功能. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |