#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]){ совершенно неверна! вы не сравниваете! при назначении не забудьте использовать ‘==’, а не ‘=’.