2015-12-14 83 views
3

我試圖通過將字符串提供給函數來減少字符串。例如:如果我有「abrakadabra」,函數將返回一串「abrkd」。這意味着所有字符只能在返回值中存在一次。我有以下功能:將char轉換爲C++中的字符串

string textletters(string text) { 
    string ret = ""; 
for (unsigned i = 0; i < text.length(); i++) { 
    if (i == 0) { 
     ret += str; 
    } else { 
     bool exist = false; 
     for (unsigned j = 0; j < i; j++) { 
      if (text.at(i) == text.at(j) { 
       exist = true; 
      } 
     } 
     if (!exist) { 
      ret += str; 
     } 
    } 
} 
return ret; 
} 

我知道 'text.at(I)' 給出了一個char回來。但是我想將這個字符轉換爲一個字符串,所以我可以連接它。

在此先感謝

+8

你不必。 'std :: string'的運算符'+ ='可以附加一個'char'就好了。 –

+0

[concatenate char \ * to string]可能重複(http://stackoverflow.com/questions/10553892/concatenate-char-to-string) – Boumbles

+0

@Boumbles不是真的這個問題的一個騙局,但可能仍然是一個騙局。 – erip

回答

5

使用push_back方法單個字符追加到std::string。您也可以使用operator +=來做到這一點。

0

這通常與std::stringstream完成:

#include <sstream> 
... 
std::stringstr ss; 
... 
ss << text.at(i); 
... 
std::string result = ss.str(); 
0

只是爲了回答這個問題,名義上的,而正如其他人所指出的,實際上不是這個問題有用:

有一個std::string構造函數需要一個字符和重複計數。因此,要創建一個包含單個字符的字符串,可以使用的1重複計數:

string(1, ch) 

但是,這是相當浪費,甚至用小串的優化實現。所以,只需將你的角色直接附加到你現有的字符串上,就像Andrew在他的回答中所說的那樣。

2

我提出了另一種方法:

C++帶有很多容器邏輯。

您可以將字符串轉換爲set,只允許一個每個值的元素:

#include <set> 
#include <algorithm> 

std::string input("akrakadabra"); 
std::set<char> only_once(input.begin(), input.end()); 

的這個缺點是字母后排序,而不是在第一個出現的順序字符串,但您沒有指定是否需要特定的訂單。

可以使用的範圍內構造,太set轉換回string

std::string result(only_once.begin(), only_once.end()); 

或相似。

0

我需要檢查我的C++課程,但就目前而言,我可以幫你用的VisualBasic代碼示例,可以它可以爲你帶來一個新的想法去實現它,檢查我所做的:

Option Explicit 
Public Function DeleteRepeated(Text As String) As String 
Dim length, i As Integer 
length = Len(Text) 
Dim NewText, Char As String 
NewText = "" 
For i = 1 To length 
Char = Mid(Text, i, 1) 
If InStr(1, NewText, Char, vbTextCompare) = 0 Then 
NewText = NewText & Char 
End If 
Next i 
DeleteRepeated = NewText 
End Function 

這裏是你在找什麼,現在在C++作爲你的要求,如果你有任何問題,只是告訴我,希望它有助於:

// Delete Repeated Char in String 
#include <iostream> 
#include <string> 
using namespace std; 

string UniqueInString (string MyString) 
{ 
    string chr,NewText; 
    for (unsigned i=0; i<MyString.length(); ++i) 
    { 
    chr = MyString.at(i); 
    if (NewText.find(chr) == string::npos) 
    { 
    NewText = NewText + chr; 
    } 
    } 
    return NewText; 
} 

int main() 
{ 
    string z = "abrakadabra"; 
    cout<< UniqueInString(z); 
} 
0

這裏有一個暗示,即返回字符序列應該有字符按原始順序,但如果這不是一個實際的要求T,則該解決方案很簡單:

std::string res = text; 
std::sort(res.begin(), res.end()); 
auto last = std::unique(res.begin(), res.end()); 
res.erase(last, res.end()); 
return res; 
0

這裏是拉姆達的解決方案:

string res = "abrakadabra"; 

    res.erase(remove_if(res.begin(), res.end(), [&res](const char& c) 
    { return find(res.c_str(), &c, c) != &c; }), res.end()); 

    cout << res << "\n"; 

輸出:abrkd