Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2013, 21:11   #11
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Вопрос, скажите что из себя представляет функция binary_search, она есть в стандартной библиотеке????
Откуда она такая взялась.
И второй вопрос, а каким образом должен выглядеть вызов этой функции....?? Я имею в виду deleteValues()
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 17.06.2013, 21:25   #12
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

binary_search в <algorithm>.
Код:
#include <iostream>
#include <algorithm>
 
using namespace std;
 
bool
deleteValues(int **mas, int &n, int count, int *vals)
{
    int j = 0;
    for (int i = 0; i < n; ++i) {
        (*mas)[j] = (*mas)[i];
        j += (!binary_search(vals, vals + count, (*mas)[i]));
    }
    bool b = (n != j);
    if (b) {
        n = j;
        int *temp = new int[n];
        std::copy(*mas, *mas + n, temp);
        delete [] *mas;
        *mas = temp;
    }
    return b;
}
 
int
main()
{
    int n = 10;
    int *a = new int[n];
    for (int i = 0; i < n; ++i) {
        a[i] = i + 1;
        cout << a[i] << ' ';
    }
    cout << endl;
    int tmp[] = {4, 6, 14};
    deleteValues(&a, n, sizeof(tmp) / sizeof(tmp[0]), tmp);
    for (int i = 0; i < n; ++i)
        cout << a[i] << ' ';
}
В прошлом коде закралась ошибка в разыменовании.

А еще "приятнее":
Код:
#include <iostream>
#include <algorithm>
 
using namespace std;
 
bool
deleteValues(int *&mas, int &n, int count, int *vals)
{
    int j = 0;
    for (int i = 0; i < n; ++i) {
        mas[j] = mas[i];
        j += (!binary_search(vals, vals + count, mas[i]));
    }
    bool b = (n != j);
    if (b) {
        n = j;
        int *temp = new int[n];
        std::copy(mas, mas + n, temp);
        delete [] mas;
        mas = temp;
    }
    return b;
}
 
int
main()
{
    int n = 10;
    int *a = new int[n];
    for (int i = 0; i < n; ++i) {
        a[i] = i + 1;
        cout << a[i] << ' ';
    }
    cout << endl;
    int tmp[] = {4, 6, 14};
    deleteValues(a, n, sizeof(tmp) / sizeof(tmp[0]), tmp);
    for (int i = 0; i < n; ++i)
        cout << a[i] << ' ';
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 17.06.2013 в 21:28.
BDA на форуме Ответить с цитированием
Старый 18.06.2013, 21:14   #13
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

А каким образом можно применить шаблон к вышеописанному коду...????
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 18.06.2013, 22:30   #14
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
#include <iostream>
#include <algorithm>
 
using namespace std;
 
template <typename T> 
bool deleteValues(T *&mas, int &n, int count, T *vals)
{
    int j = 0;
    for (int i = 0; i < n; ++i) {
        mas[j] = mas[i];
        j += (!binary_search(vals, vals + count, mas[i]));
    }
    bool b = (n != j);
    if (b) {
        n = j;
        T *temp = new T[n];
        std::copy(mas, mas + n, temp);
        delete [] mas;
        mas = temp;
    }
    return b;
}
 
int
main()
{
    int n = 10;
    int *a = new int[n];
    for (int i = 0; i < n; ++i) {
        a[i] = i + 1;
        cout << a[i] << ' ';
    }
    cout << endl;
    int tmp[] = {4, 6, 14};
    deleteValues<int>(a, n, sizeof(tmp) / sizeof(tmp[0]), tmp);
    for (int i = 0; i < n; ++i)
        cout << a[i] << ' ';
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 18.06.2013 в 23:44.
BDA на форуме Ответить с цитированием
Старый 18.06.2013, 23:27   #15
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

BDA шикарный код. Спасибо огромное. На его базе я уже развернул довольно таки большой программный код.... Серьезна. Просто отлично....
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 18.06.2013, 23:33   #16
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Кстати пока не забыл еще вопрос.
Код:
int *temp = new int[n];
Этот кусок кода не должен выглядеть так
Код:
int *temp = new T[n];
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 18.06.2013, 23:39   #17
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Пожалуйста.
new T[n] - да, прошляпил это (исправил в посте выше).
Точнее, должно быть T *temp = new T[n];.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 18.06.2013 в 23:44.
BDA на форуме Ответить с цитированием
Старый 19.06.2013, 10:54   #18
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Код:
T *temp = new T[n];.
Да действительно, не досмотрел.

Можно ще один вопрос, что бы далеко от темы не уходить.
Если я вручную заполняю массив символами (char) наприм. {a, b, c, d, 1, 4, 2}. При удалении нескольких элементов (только букв или цифр все замечательно выполняется), а если я удаляю например одну букву и две цифры, ошибка (АЛАРМ!!!). С чем это может быть связано, ведь они воспринимаются все как char???? В тему последнего кода...
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!

Последний раз редактировалось Bugrimov; 19.06.2013 в 10:56.
Bugrimov вне форума Ответить с цитированием
Старый 19.06.2013, 11:28   #19
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Массив удаляемых элементов должен быть упорядочен по возрастанию, т.е., например, {'1', 'A', 'a'}.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 19.06.2013 в 12:30.
BDA на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление элемента из массива, C#. umpik Помощь студентам 0 31.05.2013 02:14
Удаление элемента массива LiuLiuJons Общие вопросы C/C++ 6 07.03.2012 23:38
удаление элемента массива Studentka_iz_ZP Общие вопросы C/C++ 2 02.10.2010 13:55
Удаление элемента из массива prostac Помощь студентам 2 30.09.2010 11:14
Удаление элемента из массива Ozerich PHP 10 14.02.2009 02:21