Лучший способ реализовать средство проверки дубликатов?

#c #arrays #oop #exception

#c #массивы #ооп #исключение

Вопрос:

Я создал случай обработки исключений, в котором он должен определять, есть ли дубликат в наборе массивов, но попытка и перехват находятся внутри цикла for, выполняющего итерацию по набору, и мне было интересно, есть ли другой эффективный способ создания этого средства проверки дубликатов.

Вот функция, которая выдает исключение:

 namespace cs_set {

    template<class ItemType>
    void ArraySet<ItemType>::add(const ItemTypeamp; newEntry) {
        //auto result1 = std::find(std::begin(items), std::end(items), newEntry);
        //int locatedIndex = getIndexOf(new);
        if (std::find(std::begin(items), std::end(items), newEntry) != std::end(items))
       {
            throw DuplicateItemError();
       }  
        else 
       {  
            items[itemCount] = newEntry;
            itemCount  ;
       }  
    }  
  

Вот цикл for, который его реализует, и мне было интересно, могу ли я сделать его лучше или эффективнее:

 void setTester(ArraySet<string>amp; set)
{
    cout << "isEmpty: returns " << set.isEmpty()
         << "; should be 1 (true)" << endl;
    displaySet(set);

    std::string items[] = {"one", "two", "three", "four", "five", "one"};
    cout << "Add 6 items to the set: " << endl;
    for (int i = 0; i < 6; i  ) {
    
        try {
            set.add(items[i]);
            cout << items[i] << endl;
        }
        catch (ArraySet<string>::DuplicateItemError e)
        {
            //set.add(items[i]);
            cout << "IT IS A DUPLICATE!" << endl;
        }
    }

    displaySet(set);

    cout << "isEmpty: returns " << set.isEmpty()
         << "; should be 0 (false)" << endl;
}
  

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

1. Нет более эффективного способа найти элемент в массиве, кроме как перебирать каждый элемент в массиве. Способ повысить эффективность заключается в изменении структуры данных, набора хэшей или сбалансированного дерева — это два стандартных варианта. C предлагает оба варианта как часть своей стандартной библиотеки (std::unordered_set и std::set соответственно).

2. Сказав, что использование исключений для неисключительных ситуаций не рекомендуется. Возможно, add следует просто вернуть логическое значение, чтобы сказать, был ли добавлен элемент или нет.

3. Это не похоже на хороший случай для исключений. Менее неуклюжий интерфейс либо ничего не вставлял, либо заменял старое значение. Добавьте способ проверки того, есть ли элемент уже в наборе, и вы можете позволить пользователю решать, является ли это исключительной ошибкой или нет.

4. Это не имеет ничего общего с ООП.