我想创建一个std::string
,其中包含由某个分隔符分开的std::map<std::string, std::string>
的第一个元素(可以使用STL或Boost)。是否有比循环更好的解决方法(一行代码)?类似于std::vector<std::string>
的boost::algorithm::join
。
我想创建一个std::string
,其中包含由某个分隔符分开的std::map<std::string, std::string>
的第一个元素(可以使用STL或Boost)。是否有比循环更好的解决方法(一行代码)?类似于std::vector<std::string>
的boost::algorithm::join
。
map_keys
和Boost.StringAlgo的join
来优雅地完成此操作:std::string get_keys(const std::map<std::string, std::string>& map) {
return boost::algorithm::join(
map | boost::adaptors::map_keys,
", ");
}
http://www.boost.org/doc/libs/1_61_0/boost/algorithm/string/join.hpp
如果您不想使用boost,那么可以尝试使用std::accumulate:
const std::string delimiter = "#";
const std::string result = std::accumulate(M.begin(), M.end(), std::string(),
[delimiter](const std::string& s, const std::pair<const std::string, std::string>& p) {
return s + (s.empty() ? std::string() : delimiter) + p.first;
});
M
是一个std::map<std::string, std::string>
。M
的 value_type
是 pair<const string, string>
。请注意额外的 const
。 - Barry
std::string get_keys(const std::map<std::string, std::string>& map) {
std::string result;
std::for_each(map.cbegin(),
map.cend(),
[&result](const decltype(map)::value_type& p) {
result += p.first;
result += ", ";
});
// Erase the last ", " from the string, if present
if (result.size() > 0) {
result.erase(result.size() - 2, 2);
}
return result;
}
reserve
来改善算法的性能。std::string result;
result.reserve(map.size() * AVG_LENGTH_STR_KEY);
operator+=
操作。正如M.M.正确指出的那样,您可以使用boost::range
(我还添加了boost::string
)来完成此操作。
如果您的映射是m
,则最后一行为
std::vector<std::string> o;
boost::copy(m | boost::adaptors::map_keys, std::back_inserter(o));
boost::algorithm::join(o, ", ");
#include <boost/range/adaptor/map.hpp>
#include <boost/range/algorithm/copy.hpp>
#include <boost/assign.hpp>
#include <boost/algorithm/string/join.hpp>
#include <algorithm>
#include <iostream>
#include <map>
#include <vector>
int main()
{
std::map<std::string, std::string> m;
m["hello"] = "world";
m["goodbye"] = "now";
std::vector<std::string> o;
boost::copy(m | boost::adaptors::map_keys, std::back_inserter(o));
std::cout << boost::algorithm::join(o, ", ") << std::endl;
}
$ ./a.out
goodbye, hello
$
如果你正在使用像仅有头文件的nlohmann::json这样的JSON库
你可以简单地尝试将其转换为一个JSON对象,只需要一行代码。 注意:要小心异常。
std::cout << "My map or vector: " << ((json)myMap)) << "\n";
编辑:我觉得这可能有点懒,但它完成了工作lol。