当输入字符串为空时,boost::split返回一个带有一个空字符串的向量。
是否可以让boost::split返回空向量?
MCVE:
#include <string> #include <vector> #include <boost/algorithm/string.hpp> int main() { std::vector<std::string> result; boost::split(result, "", boost::is_any_of(","), boost::algorithm::token_compress_on); std::cout << result.size(); }
输出:
1
期望的输出:
0
如果您考虑以下因素,您可以看到为什么这种情况一致:
<强> Live On Coliru
#include <boost/algorithm/string.hpp> #include <string> #include <iostream> #include <iomanip> #include <vector> int main() { for (std::string const& test : { "", "token", ",", "token,", ",token", ",,", ",token,", ",,token", "token,," }) { std::vector<std::string> result; boost::split(result, test, boost::is_any_of(","), boost::algorithm::token_compress_on); std::cout << "\n=== TEST: " << std::left << std::setw(8) << test << " === "; for (auto& tok : result) std::cout << std::quoted(tok, '\'') << " "; } }
打印
=== TEST: === '' === TEST: token === 'token' === TEST: , === '' '' === TEST: token, === 'token' '' === TEST: ,token === '' 'token' === TEST: ,, === '' '' === TEST: ,token, === '' 'token' '' === TEST: ,,token === '' 'token' === TEST: token,, === 'token' ''
因此,您可以通过从前端和末尾修剪分隔符并检查剩余输入是否为空来修复它:
<强> Live On Coliru
#include <boost/algorithm/string.hpp> #include <boost/utility/string_view.hpp> #include <string> #include <iostream> #include <iomanip> #include <vector> int main() { auto const delim = boost::is_any_of(","); for (std::string test : { "", "token", ",", "token,", ",token", ",,", ",token,", ",,token", "token,," }) { std::cout << "\n=== TEST: " << std::left << std::setw(8) << test << " === "; std::vector<std::string> result; boost::trim_if(test, delim); if (!test.empty()) boost::split(result, test, delim, boost::algorithm::token_compress_on); for (auto& tok : result) std::cout << std::quoted(tok, '\'') << " "; } }
印刷:
=== TEST: === === TEST: token === 'token' === TEST: , === === TEST: token, === 'token' === TEST: ,token === 'token' === TEST: ,, === === TEST: ,token, === 'token' === TEST: ,,token === 'token' === TEST: token,, === 'token'
使用Spirit X3,在我看来更灵活,更有效:
<强> {{3}}
#include <boost/spirit/home/x3.hpp> #include <string> #include <iostream> #include <iomanip> #include <vector> int main() { static auto const delim = boost::spirit::x3::char_(","); for (std::string test : { "", "token", ",", "token,", ",token", ",,", ",token,", ",,token", "token,," }) { std::cout << "\n=== TEST: " << std::left << std::setw(8) << test << " === "; std::vector<std::string> result; parse(test.begin(), test.end(), -(+~delim) % delim, result); for (auto& tok : result) std::cout << std::quoted(tok, '\'') << " "; } }