C++ 不带第三根线的胶粘线

C++ 不带第三根线的胶粘线,c++,regex,string,boost,C++,Regex,String,Boost,我有两个字符串,需要使用boost::regex将它们解析为一个字符串。为了实现这一点,我需要将字符串粘在一些类似于boost::string\u ref的对象中,但是不允许额外分配 换句话说,我需要这样的东西 const char s1[] = "abcd<ht"; const char s2[] = "ml>giuya"; boost::regex e("<[^>]*>"); //this is what i'm looking for auto glued

我有两个字符串,需要使用
boost::regex
将它们解析为一个字符串。为了实现这一点,我需要将字符串粘在一些类似于
boost::string\u 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);
const char s1[]=“abcdgiuya”;
boost::regex e(“]*>”);
//这就是我要找的
自动胶粘字符串=制作胶粘字符串(s1,尺寸为(s1)-1,
s2,sizeof(s2)-1);
boost::regex_迭代器
它(胶合字符串.begin(),胶合字符串.end(),e,
boost::match_default | boost::match_partial);
所以问题是有没有合适的库,或者我必须自己实现?谢谢。

\include
#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;
}
#包括 #包括 #包括 #包括 常量字符s1[]=“abcdgiuya”; int main(){ 自动粘合=增强::范围::连接( s1 |增压::适配器::索引(0), s2 | boost::Adapters::indexed(0));
std::cout这是你的答案-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;
}
#包括
#包括
#包括
使用名称空间std;
模板
字符串粘合\u字符串(T1(&src1)[N1],T2(&src2)[N2])
{
字符串s(开始(src1),结束(src1));
s、 插入(结束、开始(src2)、结束(src2));
返回s;
}
int main()
{
const char s1[]=“你好,”;
const char s2[]=“世界”;

您是否试图用正则表达式解析某种类似HTML的语法。请参阅,谢谢,但这只是一个示例。我的任务确实需要正则表达式。boost::range::join应该可以工作(尽管我指出了错误的版本)。请看这个问题:这似乎是我需要的,谢谢,我会尝试它。这是用于融合向量。不是用于由正确的boost::range::join替换的字符串(并经过测试)。我需要将两个字符串作为一个字符串传递给boost::regex。并且不允许额外分配。请在回答之前仔细阅读。“复制几乎总是更快”声明似乎很可笑。它取决于(而且仅取决于)使用模式,因为链接避免的东西-分配!-在许多情况下很容易控制运行时成本。这是违反直觉的,但并不可笑。涉及链接迭代器对的解决方案要求每个字符串部分(开始和结束)至少存储2个指针。这是8或16个字节,具体取决于体系结构。因此,在上面的示例中,boost::join的结果将导致一个结构,该结构包含至少4个指针,外加一个字符串间迭代器和一个字符串内迭代器。即,对于SSO(短字符串优化),至少包含24个字节您会发现std::string解决方案可能至少同样有效。
#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;
}