c++中左边的分割字符串

Split string on the left in C++

本文关键字:分割 字符串 左边 c++      更新时间:2023-10-16

我想写一个简短而愚蠢的方程解析器,需要在给定的操作符周围分割字符串。我可以通过

来分割字符串的右侧
return std::string(oprtr + 1, equ.end());

,其中equ是字符串,oprtr是需要拆分的位置的迭代器。这样做效果很好,但是把左边分开就不行了:

return std::string(equ.begin(), oprtr - 1);
====
terminate called after throwing an instance of 'std::length_error'
  what():  basic_string::_S_create

我已经尝试了很多其他令人讨厌的变通方法,我真的不觉得自豪,比如

return equ.substr(0, std::distance(equ.begin(), oprtr));

这个不给出错误,但实际上只是返回整个方程。我哪里做错了?

适用于我的g++ 4.8.2:

#include <string>
#include <algorithm>
#include <iostream>
int main() {
    std::string eq("a+b=c");
    std::string::iterator opit = std::find(eq.begin(),eq.end(),'=');
    std::string lhs = std::string(eq.begin(),opit);
    std::cout << "lhs: " << lhs << "n";
    return 0;
}

输出如下:lhs: a+b

似乎你在做这样的事情

void my_func(string equ, string::iterator oprtr)
{
    string left = std::string(equ.begin(), oprtr);
}
string::iterator oprtr = equ.find('=');
my_func(equ, oprtr);

这将不起作用,因为在my_func中,您有两个迭代器到不同的字符串。因为当您调用my_func时,会复制原始字符串。

一个修复方法是通过引用 传递
void my_func(string& equ, string::iterator oprtr)

另一个修复方法是使用整数代替迭代器。整数不像迭代器那样绑定到一个特定的字符串实例。