как избежать дублирования записи в массиве строк?

#c #arrays #string #duplicates

#c #массивы #строка #дубликаты

Вопрос:

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

Комментарии:

1. std::unordered_set<std::string>

Ответ №1:

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

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

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

Правка2:

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"));
}
  

Комментарии:

1. Я бы рекомендовал std::unordered_set , если у вас это есть, std::set если нет.

2. пользователь будет постоянно вводить, скажем, свой адрес электронной почты, но я хочу сохранить его как строку только один раз в массиве, поэтому, даже если они введут его дважды или более, он не будет сохранен в моем массиве, может ли set<string> сделать это?

Ответ №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 amp;amp; 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();

}
  

Комментарии:

1. Андерс К. не могли бы вы, пожалуйста, скомпилировать и проверить его, он здесь не работает, хотя все кажется правильным.

Ответ №3:

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

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

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

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