把vector,set里的string用逗号隔开取出来

本文介绍如何利用Boost库中的algorithm::join函数,将vector或set中的string元素以逗号分隔并组合成一个新的字符串。这是一个高效且简洁的方法,适用于需要将多个字符串元素转换为单一字符串的场景。

把vector<>,set<>里的string用逗号隔开取出来

  • 直接调用boost库里的函数:boost::algorithm::join(const SequenceSequenceT& Input,
    const Range1T& Separator);

boost::algorithm::join(m_accountKeys, ",");//把m_accountKeys里的string用逗号隔开,返回一个新的string

``` #include <iostream> using namespace std; #include <algorithm> #include <sstream> #include <unordered_map> #include <unordered_set> #include <vector> // 写挺长时间的,通过14/19 // a1-a2,a1-a3,a2-a3 // a3 // 结果应是:, // 难受,a3->a2->a1,a3->a1,遇见a3直接return但是a2也不应该访问但是a2的vis是false所以还是遍历了! // 直接用DFS好难写,居然卡住了,换个思路,用DFS和BFS遍历fault中的元素然后做减法 // 通过17/19,还有1个运行故障,吐血 // a3-a2,a4-a1 // a2,a5 // 结果应是:a4,a1 // 故障列表中可能出现关系列表中没出现的顶点!!添加判断后通过18/19,还有1个异常 // 还是大用例,吐血 vector<string> Split(const string &s, char c) { vector<string> ans; // istringstream 纯输入流(只读) 仅需从字符串读取数据时使用 // stringstream 输入输出流(读写) 需要同时读写字符串时使用 // ​所有字符串流类均不会修改原字符串:无论传入的参数是否为const,流对象均通过复制构造内部缓冲区的方式操作数据 istringstream is(s); string sub; while (getline(is, sub, c)) { ans.emplace_back(sub); } return ans; } vector<string> dependency; unordered_set<string> fault; unordered_set<string> all_faults; // 所有故障的服务 unordered_map<string, int> services; // 服务-下标(依赖关系列表中出现的次序) unordered_map<string, vector<string>> edges; // 服务-依赖它的其他服务 vector<string> res; void dfs(const string &v, vector<bool> &vis) { vis[services[v]] = true; all_faults.emplace(v); // 加入集合 for (auto &w : edges[v]) { if (!vis[services[w]]) { dfs(w, vis); } } } int main() { // 半角逗号分隔的依赖关系列表(换行) // 半角逗号分隔的故障服务列表 string s1, s2; while (cin >> s1 >> s2) { // 注意 while 处理多个 case // 依赖关系:服务1-服务2 表示“服务1”依赖“服务2” // 服务1-服务2 = 服务2->服务1,有向图 dependency = Split(s1, ','); istringstream is(s2); string sub; while (getline(is, sub, ',')) { fault.emplace(sub); } int i = 0; // 索引 for (auto &d : dependency) { // 服务1-服务2 = 服务2->服务1 int pos = d.find('-'); string service1 = d.substr(0, pos); string service2 = d.substr(pos + 1); if (services.find(service1) == services.end()) { services.emplace(service1, i); i++; } if (services.find(service2) == services.end()) { services.emplace(service2, i); i++; } edges[service2].emplace_back(service1); } vector<bool> vis(fault.size(), false); // i==services.size() for (const string &v : fault) { if (services.find(v) != services.end() && !vis[services[v]]) { // cout << "v=" << v << endl; dfs(v, vis); } } // 把没故障的服务加入res for (const auto &p : services) { if (all_faults.find(p.first) == all_faults.end()) { res.emplace_back(p.first); } } int n = res.size(); if (n == 0) { // 没有正常节点输出单独一个半角逗号 cout << ","; return 0; } sort(res.begin(), res.end(), [](const string &s1, const string &s2) { return services[s1] < services[s2]; }); cout << res[0]; for (int i = 1; i < n; i++) { cout << "," << res[i]; } } return 0; } // 64 位输出请用 printf("%lld")```Segmentation fault. #0 0x00001555546a8609 in free () from /nix/glibc-2.40-66/lib/libc.so.6 #1 0x0000000000405540 in std::__new_allocator<std::__detail::_Hash_node<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, true> >::deallocate (this=<optimized out>, __p=0x432fb0, __n=1) at /nix/gcc/include/c++/14-20241116/bits/new_allocator.h:156 156 deallocate(_Tp* __p, size_type __n attribute ((unused))) #2 std::allocator_traits<std::allocator<std::__detail::_Hash_node<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, true> > >::deallocate (__a=…, __p=0x432fb0, __n=1) at /nix/gcc/include/c++/14-20241116/bits/alloc_traits.h:544 544 { __a.deallocate(__p, __n); } #3 std::__detail::_Hashtable_alloc<std::allocator<std::__detail::_Hash_node<std::__cxx11::basic_string<char, std::char_trait
04-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值