gpt4 book ai didi

c++ - boost::join 和 boost::transformed

转载 作者:太空狗 更新时间:2023-10-29 21:43:12 25 4
gpt4 key购买 nike

我想使用 boost 将字符串与“,”连接起来。但是我有一个 shared_ptr vector ,我需要将其转换为字符串。

(愚蠢的做法是使用 boost::transform 将我的共享指针转换为字符串 vector )。但我想做这样的事情。

注意:我使用的是 VS2012(以及用于 Linux 构建的 gcc 4.5.3)和 boost 1.48.0

C++ 代码。

std::string A::returnConcatString() const
{
return boost::algorithm::join( sharedPtrList() | boost::adaptors::transformed(
[](B::ConstPtr obj )->std::string
{
return ( boost::format( "%s:%s" ) % obj->string1() % obj->string2() ).str();
} ),
",");
}

(顺便说一句,如果我使用匿名函数而不是使用 string2() 会发生什么?)

HPP 代码。

class A
{
public:
/***code***/
vector< B::ConstPtr > sharedPtrList() const;
std::string returnConcatString() const;
}

class B
{
public:
typedef boost::shared_ptr<const B> ConstPtr;
std::string string1() const;
std::string string2() const;
}

有更好的方法吗?谁能帮我理解我的问题?

另外,我看到了这个链接 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3594.html (这正是我想模仿的)

当我编译这段代码时出现错误。

C:\temp\tools\Windows\Boost\1.48.0\boost/utility/result_of.hpp(79): error C2903: 'result' : symbol is neither a class template nor a function template
C:\temp\tools\Windows\Boost\1.48.0\boost/utility/result_of.hpp(87) : see reference to class template instantiation 'boost::detail::result_of_nested_result<F,FArgs>' being compiled
with
[
F=balh::`anonymous-namespace'::<lambda0>,
FArgs=balh::`anonymous-namespace'::<lambda0> (const boost::shared_ptr<const balh::B> &)
]
C:\temp\tools\Windows\Boost\1.48.0\boost/utility/detail/result_of_iterate.hpp(33) : see reference to class template instantiation 'boost::detail::tr1_result_of_impl<F,FArgs,HasResultType>' being compiled
with
[
F=balh::`anonymous-namespace'::<lambda0>,
FArgs=balh::`anonymous-namespace'::<lambda0> (const boost::shared_ptr<const balh::B> &),
HasResultType=false
]
C:\temp\tools\Windows\Boost\1.48.0\boost/utility/detail/result_of_iterate.hpp(81) : see reference to class template instantiation 'boost::tr1_result_of<F>' being compiled
with
[
F=balh::`anonymous-namespace'::<lambda0> (const boost::shared_ptr<const balh::B> &)
]
C:\temp\tools\Windows\Boost\1.48.0\boost/mpl/eval_if.hpp(41) : see reference to class template instantiation 'boost::result_of<F>' being compiled

编辑:感谢 [utnapistim] 想法。我现在正在使用这个。但我真的很想写一个单行:)。

我最终这样做了。

std::string ret;
std::for_each ( array.begin(), array.end(), [&ret](B::ConstPtr firmware)
{
ret.append( ( boost::format( "[%s:%s]" ) % firmwareTypeToString( firmware->firmwareType() ) % firmware->version() ).str() );
}
);

最佳答案

我会这样写:

std::string returnConcatString() const {
std::ostringstream os;
for(auto& b : sharedPtrList)
os << b->string1() << ':' << b->string2() << ',';

auto s = os.str();
if (!s.empty())
s.resize(s.size()-1);
return s; // moves
}

令人惊讶的是,编译时间更短,运行时也比您的代码要好很多

查看 Live On Coliru

如果您真的关心性能,我建议使用 Boost Karma:

std::string returnConcatString() const {
if (sharedPtrList.empty())
return {};

std::string result;
result.reserve(20 * sharedPtrList.size()); // average length preallocate?

auto out = back_inserter(result);

namespace k = boost::spirit::karma;
for(auto& b : sharedPtrList)
k::generate(out, k::string << ':' << k::string << ',', b->string1(), b->string2());

result.resize(result.size()-1);
return result; // moves
}

查看 Live On Coliru too

性能比较:

http://i.imgur.com/2MKtByb.png

如您所见,stringstream 方法仅在小型集合中表现不佳。

原始数据和 benchmark code

关于c++ - boost::join 和 boost::transformed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23551653/

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