没有第3个字符串的胶水串

时间:2014-07-28 17:16:22

标签: c++ regex string boost

我有两个字符串,我需要将它们解析为boost::regex。为了实现这一点,我需要在一些boost::string_ref类似的对象中粘贴我的字符串,但不允许额外的分配

换句话说,我需要这样的东西。

const char s1[] = "abcd<ht";
const char s2[] = "ml>giuya";

boost::regex e("<[^>]*>");

//this is what i'm looking for
auto glued_string = make_glued_string(s1, sizeof(s1)-1,
                                      s2, sizeof(s2)-1); 

boost::regex_iterator<glue_string::iterator> 
    it(glued_string.begin(), glued_string.end(), e, 
    boost::match_default | boost::match_partial);

所以问题是有没有合适的图书馆或我必须自己实现这个?感谢。

2 个答案:

答案 0 :(得分:2)

#include <string>
#include <iostream>

#include <boost/range/adaptor/indexed.hpp>
#include <boost/range/join.hpp>
#include <boost/regex.hpp>

const char s1[] = "abcd<ht";
const char s2[] = "ml>giuya";

int main() {
    auto glued = boost::range::join(
        s1 | boost::adaptors::indexed(0),
        s2 | boost::adaptors::indexed(0));
    std::cout << "glued: ";
    for (auto c : glued)
        std::cout << c;
}

答案 1 :(得分:-1)

这是你的答案 - 100%效率(ish)。

为了预先防止早期批评,复制几乎总是比参考链更快。

#include <iostream>
#include <string>
#include <type_traits>

using namespace std;

template<typename T1, int N1, typename T2, int N2>
string glue_string(T1 (&src1)[N1], T2 (&src2)[N2])
{
    string s(begin(src1), end(src1));
    s.insert(end(s), begin(src2), end(src2));
    return s;
}

int main()
{
    const char s1[] = "Hello, ";
    const char s2[] = "World";
    cout << glue_string(s1,s2) << endl; 

   return 0;
}

但你不确定你真的不想这样:

#include <iostream>
#include <iterator>

const char src[] = "Hello,"
" World";

using namespace std;

int main()
{
    auto first = begin(src);
    auto last = end(src);
    for( ; first != last ; ++first)
        cout.put(*first);
    return 0;
}

字符串连接由编译器完成 - 字符串的零拷贝,因为如果编译器知道长度,则c ++ 11 begin()和end()在c样式数组上工作。