2015-08-08 93 views
-1

我想寫一個簡短而愚蠢的方程分析器,並且需要圍繞給定的運算符分割字符串。我可以通過做在C++左邊的分割字符串

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)); 

這一個不會給出錯誤,但實際上只是返回整個方程。我在這裏做錯了什麼?

+0

沒有足夠的代碼來弄清楚。什麼是oprtr? – MSalters

+0

oprtr是我需要從中拆分的位置的迭代器。對不起,我會將其添加到問題文本中。 – Sourec

+1

'返回std :: string(equ.begin(),oprtr);'和'返回std :: string(oprtr + 1,equ.end());'看起來對我很正確。不知道爲什麼你想從你的最終位置減去一個。 – john

回答

1

看來你是做這樣

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) 

另一個解決辦法是使用整數代替迭代器通過。整數不像迭代器那樣綁定到一個特定的字符串實例。

+0

這樣做,謝謝。我不知道我是怎麼錯過的,我想這只是沒有跨過我的腦海,因爲分裂到正確的工作使用相同的技術。非常感謝! – Sourec

2

工作對我來說與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

+0

因此,這也適用於我,但它使用了我以前嘗試過的完全相同的事情,與構造函數進行拼接......但不知何故,這種方法沒有拋出錯誤。我必須假設它與std :: find()有關,但不幸的是,這不適用於我的情況,整個事情實際上是在一個函數中,迭代器和字符串作爲參數傳入。 – Sourec

+0

所以這就是線索,你正在傳遞迭代器和迭代器指向的字符串**拷貝**。您需要原始字符串,而不是副本。通過參考傳遞。 – john

+0

@Sourec你應該真的發佈一個演示錯誤的最小工作示例。好的,約翰的提示是真實的。如果你傳遞'std :: string',你會得到一個副本,但迭代器是原始字符串。你應該使用參數類型'std :: string&'傳遞原始字符串。 – Tobias