как избежать дублирования записи в массиве строк? - PullRequest
1 голос
/ 03 ноября 2011

В моем небольшом проекте я хочу создать небольшую программу, в которой мне нужно хранить неограниченное количество уникальных строк, но пользователь может вводить одну и ту же уникальную строку несколько раз. Но в моем массиве я хочу, чтобы только один уникальный идентификатор был сохранен только один раз. Проще говоря, я не хочу дублировать данные в моем массиве. Я хочу сделать это в 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 ]

7 голосов
/ 03 ноября 2011

Если вы хотите сохранить список уникальных strings, то проще всего использовать правильный инструмент для работы;а именно set<string>, а не массив string.

Редактировать:

Если вам не нужно сортировать коллекцию строк (как это делает set),и он у вас есть, было бы целесообразнее использовать unordered_set, а не set.set будет просто выполнять ненужную сортировку каждый раз, когда вы добавляете строку.

Edit2:

A set является ассоциативным массивом, что означает, что может быть только один элемент с данным ключом,В случае set<string> ключ - это string, который вы вставляете.Если вы вставляете один и тот же ключ несколько раз, в set.

все равно будет только один его экземпляр. Вот пример программы, иллюстрирующей это.Если вы запустите это, вы обнаружите, что вывод - это всего лишь один «foo», хотя «foo» был вставлен 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"));
}
2 голосов
/ 03 ноября 2011

не скомпилировал это, но что-то вроде этого должно работать, при этом вы должны использовать 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 голосов
/ 03 ноября 2011

Вы должны использовать векторную форму, чтобы сохранить список строк. Например, вы можете использовать набор (http://www.cplusplus.com/reference/stl/set/).

Кроме того, если вам нужно проверить, существует ли строка в объекте set <>, вам нужно проверить это с помощью метода find (): http://www.cplusplus.com/reference/stl/set/find/

Я думаю, это все, что тебе нужно.

К вашему сведению: строка: if (ch = str [i]) {совершенно неверна! вы не сравниваете! вы назначаете, не забудьте использовать «==», а не «=».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...