gpt4 book ai didi

c++ - 使用 boost::algorithms::join 提取和连接字符串

转载 作者:搜寻专家 更新时间:2023-10-31 01:43:25 34 4
gpt4 key购买 nike

我有一个特定结构的集合,我想将每个结构的字符串成员连接到一个以分号分隔的列表中。很好地利用了标准算法库和Boost,问题很容易分解:

  1. 使用std::transform获取字符串的集合,然后
  2. 调用boost::algorithm::join加入他们。

但是,复制字符串只是为了将它们提供给 join很傻,所以我尝试使用 reference_wrapper围绕字符串作为 std::transform 的输出.相应的代码可以在这里看到:

struct IPAddress {
vector<uint8_t> binaryValue;
string stringValue;
}

// ---snip---

vector<IPAddress> addresses;

// Populate and manipulate the addresses vector
// ---snip---

// Join the list.
vector<reference_wrapper<string>> addressStrings(addresses.size());
transform(begin(addresses), end(addresses), begin(addressStrings),
[](const IPAddress& addr) {
return ref(addr.stringValue); // Expodes
});

return boost::algorithm::join(addressStrings, ";"); // Also explodes

提供给 std::transform 的 lambda编译失败,声称两个 reference_wrapper<string> 之间的赋值运算符不匹配s,尽管那是documented以及 reference_wrapper 的全部内容.

然后,如果我注释掉 transform打电话,boost::algorithm::join尝试调用 reference_wrapper 的默认构造函数无论如何都会失败(没有)而不是 string .

我是不是错过了一些直接的东西,还是我应该放弃并使用 for用迭代器循环?

最佳答案

在 boost 范围的一点帮助下,您可以吃蛋糕并吃它。

它消除了这种混合的刺痛:复杂的是你想使用 std::string const& 的中间集合,但是,显然这不适用于 std::vector

因此,我们放弃了中间集合,而是使用一个自适应 View (boost::adaptors::transformed),而且也不需要 lambda[¹] , 只需使用 std::mem_fun: 见 Live On Coliru

#include <boost/algorithm/string.hpp>
#include <boost/range/adaptors.hpp>

#include <vector>
#include <string>
#include <functional>

struct IPAddress {
std::vector<uint8_t> binaryValue;
std::string stringValue;
};

std::string foo(std::vector<IPAddress> const& addresses)
{
using namespace boost::adaptors;
return boost::algorithm::join(
addresses | transformed(std::mem_fn(&IPAddress::stringValue)),
";");
}

#include <iostream>

int main()
{
std::vector<IPAddress> const addresses {
{ {}, "test1" },
{ {}, "test2" },
};

std::cout << foo(addresses);
}

打印

test1;test2

[¹] 除非 stringValue 是一个重载的成员函数

关于c++ - 使用 boost::algorithms::join 提取和连接字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25189971/

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