我的问题很简单:我有一个动态对象数组,这些对象具有返回字符串的方法。我想将所有这些字符串连接在一起。
如果我有一个字符串数组而不是带有返回字符串的方法的对象,那么这将是一个微不足道的任务:
std::vector<std::string> v{ "f", "o", "o" };
std::string const x = std::accumulate(v.begin(), v.end(), std::string());
但就我而言,它看起来像这样:
struct foo
{
foo(std::string const & name) : name_(name) {}
std::string const & name() const { return name_; }
private:
std::string const name_;
};
std::vector<foo> v{ foo("f"), foo("o"), foo("o") };
我想使用标准库算法,因为我确信它们是高效的,并且我不需要调试它们,但这很难阅读和理解:
std::vector<std::string> transformed(v.size());
std::transform(v.begin(), v.end(), transformed.begin(),
[](foo const & f) { return f.name(); });
std::string const x = std::accumulate(transformed.begin(), transformed.end(),
std::string());
未来的维护者可能(并且理应如此)追捕我,以免我不必要地使一项简单的任务复杂化,这可以用以下方法解决:
std::string x;
for(auto const & f : v)
x += f.name();
这里有没有我看不到的更简单的东西,或者确实是应该让标准库休息并使用for循环的情况(无论如何,这归结起来)?
如果您坚持使用STL,则还有另一个版本std::accumulate
:
template< class InputIt, class T, class BinaryOperation >
T accumulate( InputIt first, InputIt last, T init, BinaryOperation op );
然后您的代码可以成为
std::string const x = std::accumulate(v.begin(), v.end(), std::string(),
[](std::string a, foo const& b){return a += b.name();});
编辑:也许更适合复制删除声明
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句