gpt4 book ai didi

c++ - 这两个功能没有合并为一个功能是有原因的吗?

转载 作者:太空狗 更新时间:2023-10-29 20:14:39 28 4
gpt4 key购买 nike

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

或者:假设您要拆分一堆不同的源,并且为了提高效率,您希望最小化内存分配(例如,您的分析器 说您在这里分配了太多)。因此,您一遍又一遍地重复使用相同的 vector ,以避免在第一次拆分后进行后续内存分配。

之前,慢:

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

当然,在一般情况下,为您创建容器的简单性很好,我们可以很容易地重用更通用的函数来以很少的成本创建第二个函数。

关于c++ - 这两个功能没有合并为一个功能是有原因的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15749799/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com