2011-11-03 122 views
1

在我的小項目中,我想製作一個小程序,我必須存儲不限數量的唯一字符串,但用戶可以多次輸入同一個唯一字符串。但在我的數組中,我只想要唯一的ID保存一次。簡單的說,我不想在我的數組中重複數據。我想用C++來做到這一點,但不知何故,我不能得到邏輯?有人可以幫我在這裏嗎?如何避免在字符串數組中重複輸入?

#include <stdio.h> 
#include <iostream> 
#include <string> 

    using namespace std; 

    int main(){ 

     string str[100],ch; 
     int i,j,n; 
     j=0;n=0; 
     //str[0]= "a"; 

     do { 
     getline(cin,ch); 
     for (i=0;i <j; i++){ 
     if (ch=str[i]){ 
         cout << "duplicate" ; 
         } 
     str[i] =ch; 
     j++; 
     } 
     n++; 
      } while (n =100); 
     getchar(); 

    } 

我小白在C++,所以請幫我在這裏

+3

'的std :: unordered_set ' –

回答

2

還沒有編譯過,但類似的東西應該可以工作,也就是說你應該使用set或類似的更多C++ sh解決這個問題的方法,如果你想要一個更高效的解決方案,需要更多的基本建議。

int main() 
{ 
    const int maxstrings = 100; // never use magic numbers, instead declare them as a constant 
    string str[maxstrings],ch; // should have other variable names that are more descriptive 
    int i,n = 0; // didn't see the need for j here, n contains number of unique strings 

    do 
    { 
     getline(cin,ch); 
     // you may want to check what is in ch first, to see if user doesn't want to enter 100 strings   

     bool duplicate = false; 

     for (i=0; !duplicate && i<n; ++i) // check among number of stored strings (n) 
     { 
     if (ch==str[i]) // use two '=' for equality i.e '==' 
     { 
      cout << "duplicate:" << ch << endl; // show the duplicate, user friendlier 
      duplicate = true; 
     } 
     } 
     // did we find a duplicate? no, then add to array 
     if (!duplicate) 
     { 
     str[n++]=ch; 
     } 
    } 
    while (n < maxstrings); 
    getchar(); 

} 
+0

Anders K.能否請你編譯並檢查它,雖然一切似乎都是正確的,但它不在這裏工作。 –

7

如果你想保持唯一strings列表,然後做最簡單的辦法是使用了合適的工具;即set<string>而不是string的陣列。

編輯:

如果你不需要你的字符串進行排序的集合(如set做),你必須提供給你,它會更適合使用unordered_set而非setset只會在每次添加字符串時進行不必要的排序。

EDIT2:

set是關聯數組,這意味着只能有一個給定的密鑰的一個元素。在set<string>的情況下,密鑰是您插入的string。如果多次插入相同的密鑰,set中仍然只有一個密鑰。

下面是一個示例程序,說明了這一點。如果你運行這個,你會發現在輸出僅僅是一個「富」,雖然「富」插入3次:

#include <set> 
#include <string> 
#include <iostream> 
#include <algorithm> 
#include <iterator> 
using namespace std; 

int main() 
{ 
    set<string> my_strings; 

    my_strings.insert("foo"); 
    my_strings.insert("foo"); 
    my_strings.insert("foo"); 

    copy(my_strings.begin(), my_strings.end(), ostream_iterator<string>(cout, "\n")); 
} 
+0

我建議'的std :: unordered_set'如果你擁有它,'的std :: set'如果不是。 –

+0

好的建議;編輯。 –

+0

用戶會連續輸入說出他們的電子郵件地址,但是我想將它作爲字符串存儲在數組中,因此即使它們輸入了兩次或更多次它也不會存儲在我的數組中,可以設置這樣做嗎? –

0

你應該使用矢量樣保持一個字符串列表。例如,您可以使用一套(http://www.cplusplus.com/reference/stl/set/)。

除此之外,如果你需要檢查字符串設定<>對象上已經存在,那麼你就需要使用find()方法來檢查它:http://www.cplusplus.com/reference/stl/set/find/

我認爲這就是你所需要的。

僅供參考:行:if(ch = str [i]){完全錯誤!你沒有比較!您正在分配,請記住使用'=='而不是'='。