boost::algorithm::join
提供了一个方便的连接std::vector<std::string>
。
std::vector<std::tuple<std::string,bool>>
如果为真,在进行联接之前,您将如何扩展此功能以使用单引号(用于字符串)包围结果。
这对循环来说并不难,但我正在寻找一种能够充分利用标准算法和 C++11 特性(例如 lambdas)的解决方案。
如果可行,继续使用 boost 的 join: 优雅/可读性/简洁性更重要。
代码
#include <string>
#include <vector>
#include <tuple>
#include <boost/algorithm/string/join.hpp>
int main( int argc, char* argv[] )
{
std::vector<std::string> fields = { "foo", "bar", "baz" };
auto simple_case = boost::algorithm::join( fields, "|" );
// TODO join surrounded by single-quotes if std::get<1>()==true
std::vector<std::tuple< std::string, bool >> tuples =
{ { "42", false }, { "foo", true }, { "3.14159", false } };
// 42|'foo'|3.14159 is our goal
}
编辑
好的,我在下面接受了 kassak 的建议并查看了boost::transform_iterator()
- 我被 boost 自己的文档中示例的冗长所推迟,所以我尝试std::transform()
了 - 它没有我想要的那么短,但它似乎有效。
回答
#include <string>
#include <vector>
#include <tuple>
#include <iostream>
#include <algorithm>
#include <boost/algorithm/string/join.hpp>
static std::string
quoted_join(
const std::vector<std::tuple< std::string, bool >>& tuples,
const std::string& join
)
{
std::vector< std::string > quoted;
quoted.resize( tuples.size() );
std::transform( tuples.begin(), tuples.end(), quoted.begin(),
[]( std::tuple< std::string, bool > const& t )
{
return std::get<1>( t ) ?
"'" + std::get<0>(t) + "'" :
std::get<0>(t);
}
);
return boost::algorithm::join( quoted, join );
}
int main( int argc, char* argv[] )
{
std::vector<std::tuple< std::string, bool >> tuples =
{
std::make_tuple( "42", false ),
std::make_tuple( "foo", true ),
std::make_tuple( "3.14159", false )
};
std::cerr << quoted_join( tuples, "|" ) << std::endl;
}