2010-04-19 57 views
2

從標題判斷,我有點用相當複雜的方式完成了我的程序。但!我不妨問問xD在字符串中查找字符在矢量中

這是一個簡單程序我在回答加速C++的問題3-3,這是一本令人敬畏的書,我認爲。

我創建了一個向量:

vector<string> countEm; 

接受所有有效的字符串。因此,我有一個包含字符串元素的向量。

接下來,我創建了一個功能

int toLowerWords(vector<string> &vec) 
{ 
    for(int loop = 0; loop < vec.size(); loop++) 
     transform(vec[loop].begin(), vec[loop].end(), 
      vec[loop].begin(), ::tolower); 

是將輸入轉化爲更容易計數全部小寫。到現在爲止還挺好。

我創建了第三個也是最後一個函數,實際上是count這個詞,那就是我被卡住的地方。

int counter(vector<string> &vec) 
{ 

for(int loop = 0; loop < vec.size(); loop++) 
    for(int secLoop = 0; secLoop < vec[loop].size(); secLoop++) 
    { 
     if(vec[loop][secLoop] == ' ') 

這看起來很荒謬。使用一個二維數組來調用矢量的字符,直到找到一個空格。荒謬。我不相信這是一個優雅或甚至可行的解決方案。如果這是一個可行的解決方案,那麼我會從空間回溯,並將我在單獨的矢量中找到的所有字符複製到那些

我的問題是。我怎樣才能將一個字符串矢量分解成單獨的單詞,以便我可以實際計數它們?我想過使用strchr,但它沒有給我任何epiphanies。通過尼爾


解決方案:

stringstream ss(input); 
while(ss >> buffer) 
    countEm.push_back(buffer); 

,從我可以很容易地算(經常性)字樣。

然後我通過Wilhelm做了一個解決方案,我會重新編寫它,因爲我不小心刪除了這個解決方案!愚蠢的我,但我會張貼,一旦我有它再次寫^^

我想感謝你們所有的投入!解決方案已經工作,我成了一個更好的程序員。如果我可以投票你的東西,那麼我會:P一旦我可以,我會的!並再次感謝!

回答

2

如果的話向來空格分隔,分裂他們的最簡單的方法是使用一個字符串流:

string words = .... // populat 
istringstream is(words); 

string word; 
while(is >> word) { 
    cout << "word is " << word << endl; 
} 

你會想要寫一個函數來做到這一點,當然,並將其應用到你的琴絃。或者最好不要將字符串存儲在allm中,而是在初始輸入時分割爲單詞。

+0

嘿!我從未使用istringstream,所以我不知道你在這裏工作的是什麼樣的魔法,但是如果我可以用這個解決方案解決問題,我會告訴你^^所以,謝謝!如上所述,一旦獲得許可,我會選擇積極的態度。 – IAE 2010-04-19 15:27:29

2

您可以使用std::istringstream逐個提取單詞並對它們進行計數。但是這個解決方案在空間複雜度上消耗O(n)。

string text("So many words!"); 
size_t count = 0; 
for(size_t pos(text.find_first_not_of(" \t\n")); 
    pos != string::npos; 
    pos = text.find_first_not_of(" \t\n", text.find_first_of(" \t\n", ++pos))) 
    ++count; 

也許並不像Neil的解決方案那麼短,但是除了已經使用的內容外,沒有空間和額外分配。

+0

感謝您的回覆^^我還不能投票,所以我會回覆您的回覆。我還沒有聽說過你使用的一些語法,所以我正在研究一些,我會讓你知道我是如何使用它,但感謝幫助者! – IAE 2010-04-19 15:26:29

+0

除了我有一個語義錯誤('text :: npos'而不是'string :: npos',我剛剛糾正了),沒有什麼特別的語法。也許縮進讓你感到困惑......這真的是一個簡單的'for'循環。 – wilhelmtell 2010-04-20 22:07:42

+0

...和一個邏輯錯誤。在我發佈之前,我應該真的測試我的代碼。 :s – wilhelmtell 2010-04-20 22:12:13

1

使用分詞器(例如listed here in section 7.3)將矢量中的字符串拆分爲單個單詞(或重寫它以便它只返回標記的數量)並循環遍歷矢量以計算您遇到的標記的總數。

+0

嘿Jiles!我已經開始閱讀,我想過使用標記器,但是在查找strtok之前我發現了strchr,並且它更安全。我也會讓你知道我是否可以用這個解決方案來回答它,因爲我想把它們全部用作可能的答案,以便我可以儘可能多功能^^ – IAE 2010-04-19 15:30:09