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

时间:2014-08-07 18:50:29

标签: c++ algorithm boost stl stl-algorithm

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

  1. 使用std::transform获取字符串的集合,然后
  2. 致电boost::algorithm::join将他们加入。
  3. 但是,复制字符串只是为了将它们提供给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>之间的赋值运算符不匹配,尽管它是documented和{{3}}的整个点。 {1}}。

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

    我是否遗漏了一些直截了当的内容,或者我应该放弃并使用带迭代器的string循环?

1 个答案:

答案 0 :(得分:3)

在提升范围的帮助下,你可以吃蛋糕然后吃。

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

所以,我们删除中间集合,而不是使用自适应视图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是重载的成员函数