加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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);
}

当然,在一般情况下,为您创建容器的简单性很好,我们可以轻松地重用更通用的功能,以较低的成本创建第二个功能.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读