我有两个字符串,我需要将它们解析为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);
所以问题是有没有合适的图书馆或我必须自己实现这个?感谢。
答案 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样式数组上工作。