2013-03-28 39 views
0

我開始學習一些來自具有Java和C#知識的通用編程背景的C++。我正在使用一些字符串,並且對某些字符串函數感到沮喪。我習慣於字符串函數返回一個新的字符串,保持舊字符串不變。我知道這是在C#和Java中完成的,因爲字符串是不可變的,但我真的希望C++中的字符串方法也可以這樣工作。有什麼我失蹤?現在我做這樣的事情:如何獲得C++字符串函數的行爲與Java和C#字符串方法類似?

std::string temp = word; 
Func(temp.erase(i , 1)); 

編輯:這是什麼樣的我在想:

Func(word.substr().erase(i , 1); 

在以下這些你都認爲是最好的?這是我想的一件小事,只是想知道。

+1

這不是沒有抹去什麼嗎? –

+1

是啊......你究竟想用字符串做什麼? – aardvarkk

+0

我不知道你錯過了什麼。 C++字符串實際上就是容器,所以它們在語義上與例如向量。如果你想要整個東西的副本,那麼你所需要做的就是創建一個。 –

回答

1

在C++中,您有兩種可能性:「就地」編輯或返回一個新字符串,例如可以使用substr

好的,我明白了。這方面的一個變種:

Func(string(word).erase(i,1)); 
+0

這就是我一直在尋找的東西。不知道我是否應該使用它或不。 – Ben313

+1

當你真的需要一個副本時(甚至是你傳遞給函數的臨時副本),使用它是可以接受的,但是默認情況下,你應該修改原始的,特別是如果你使用相同的成員函數(比如** erase * *)多次使用相同的參數。 –

1

每當你想一個副本,明確地聲明它:

std::string copy = original; 
copy.erase(startPos, size); 

不斷時,你實際上並不需要拷貝複製串是性能的浪費,和C++設計即使在舊的硬件上,大型程序(如遊戲,辦公套件或網絡瀏覽器)也能夠流暢運行。

爲了滿足這個非常重要的需求,C++的座右銘是「不要支付你不需要的東西」,而整個語言都是圍繞這個設計的。

這並不意味着像Java這樣的其他語言更糟或更好,只是它們服務於不同的目的和不同的需求,因此功能不同。 Java的主要用途是「在任何地方和任何地方運行相同的可執行文件」(字面意思是:「write once, run everywhere」),這就是它存在於虛擬機上的原因,以及爲什麼Java代碼在$ 10手機,$ 1000智能手機,電腦,網頁瀏覽器和微波爐。