Мегаобучалка Главная | О нас | Обратная связь


Функция с переменным числом аргументов



2019-11-13 330 Обсуждений (0)
Функция с переменным числом аргументов 0.00 из 5.00 0 оценок




Передача массивов как параметров

Передача многомерных массивов

int sum(int count, ...){

int s = 0;

for(inti = 1; i <= count; i++)

   s += (&count)[i];  

return s;

}

 

int main(){

std::cout << sum(5, 20, 30, 40, 1, 1) << std::endl;

return 0;  

}

Множества и мультимножества

Множества — это наборы уникальных значений; мультимножества допускают повторяющиеся значения. В остальном они совершенно идентичны, так что в дальнейшем можно говорить просто о “множествах”.

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

Элементы множества всегда сортированы. Поэтому поиск нужного ключа очень прост и эффективен.

Что касается последовательных операций и прямого доступа, то тут множества далеки от совершенства. Набор функций-элементов у множеств невелик по сравнению с другими контейнерами.

Перечисления

Перечисления можно рассматривать как очень упрощенный аналог множеств.

Перечисления - это тип, который может содержать значения указанные программистом. Целочисленные именованные константы могут быть определены как члены перечисления. Например:

enum {RED, GREEN, BLUE};

определяет три целочисленные константы и присваивает им значения. По умолчанию, значения присваиваются по порядку, начиная с нуля, т.е. RED == 0, GREEN == 1 и BLUE == 2. Перечисление также может быть именованным:

enum color {RED, GREEN, BLUE};

Каждое перечисление - это отдельный тип, и тип каждого члена перечисления - это само перечисление. Например, RED имеет тип color.

Пример

Выразим денежные единицы Русского Царства при Петре I Великом в самой мелкой монете (полушка = 0.25 коп.)

enum rusmoney{

polushka = 1,

denga = 2,

kopeyka = 4,

grosh = 8,

altyn = 12,

grivennik = 40,

pyatialtyn = 60,

dvugrivenniy = 80,

poltina = 200,

rubl = 400

};

Задача №171.  Сет

Рассмотрим правила настольной игры "Сет".

На столе выложено 12 карточек, на каждой из которых нарисована некоторая фигурка. Фигурка обладает тремя свойствами: формой, цветом и раскраской. Сетом называется комбинация из трех таких карточек, что по каждому свойству они или одинаковые, или полностью разные.

Примеры сетов:

1. красный закрашенный треугольник, зеленый закрашенный квадрат, синий закрашенный круг

2. красный закрашенный квадрат, красный заштрихованный квадрат, красный пустой квадрат

3. синий пустой треугольник, синий закрашенный квадрат, синий заштрихованный круг

Участники на скорость находят сеты в выложенном наборе карточек.

Вам дан некоторый набор карточек. Перечислите все сеты, которые в нем можно найти (сеты могут пересекаться между собой).

Выходные данные

В каждой строке по три числа – номера фигур, составляющих сет. Нумерация фигур начинается с единицы.

Решение

Три фигуры по каком-либо признаку соответствуют сету, если у них количество фигур из них с данным признаком равно 0 или 3. Т.е. остаток от деления этого количества на 3 равен нулю.

#include <iostream>

#define N 12

using namespace std;

enum color{red, green, blue};

enum fill{empty, hatched, filled};

enum shape{triangle, circle, square};

int a[N][3]={

blue, filled, triangle,

green, empty, circle,

blue, filled, circle,

green, hatched, circle,

red, filled, square,

blue, hatched, circle,

green, hatched, triangle,

blue, filled, square,

green, filled, circle,

red, hatched, circle,

red, filled, circle,

red, hatched, square,

}, tmp;

int main(){

for(int i1 = 0; i1 < N-2; i1++)

   for(int i2 = i1+1; i2 < N-1; i2++)

       for(int i3 = i2+1; i3 < N; i3++){

           tmp = 0;

           for(int p = 0; p < 3; p++)

               tmp += ((a[i1][p]==a[i2][p])+

                       (a[i1][p]==a[i3][p])+

                       (a[i2][p]==a[i3][p])) % 3;

           if(!tmp) cout << i1 + 1 << " " << i2 + 1

                         << " " << i3 + 1 << endl;

       } 

}

Множества

Для сета определены следующие операции[34]:

1. Создание.

Как и для множество других контейнеров stl, чтобы объявить set, необходимо прописать

set<type_here> set_name;

Можно также использовать конструктор, чтобы сразу инициализировать контейнер. Инициализацию можно провести другим контейнером или парой итераторов [first, last).

2. Добавление.

Выполняется посредством перегруженной функции insert. Синтаксис её вызова:

set<*тип данных элементов, хранящихся в a*> a;

a.insert(*аргументы здесь*);

Вот её основные варианты:

pair<iterator,bool> insert( const value_type& value );

Принимает value — значение, которое следует вставить в множество и возвращает пару — итератор, указывающий на вставленный элемент и bool’еву переменную, обозначающую "успешность" вставки. Т.е. 1 — вставка произошла, 0 — нет. Данная функция выполняется за логарифм от размера контейнера, то есть, за O(logn).

iterator insert( iterator hint, const value_type& value );

Принимает значение value и итератор hint и пытается вставить элемент как можно ближе к итератору hint. Если вставка будет произведена сразу после или перед итератора hint, то функция отработает за O(1), иначе за O(logn).

template< class InputIt >

void insert( InputIt first, InputIt last );

Добавляет в set все элементы, находящиеся на промежутке [first;last) за O((last - first)logn). InputIt должен соответствовать требованиям InputIterator, т.е. поддерживать следующие операции:

· Сравнение (a != b);

· Разыменование (*a);

· Инкремент (a++  и  ++a);

· Инкремент значения (*a++);

При этом все указатели и итераторы на элементы set остаются в рабочем состоянии. Стоит также отметить, что set поддерживает лишь одно вхождение элемента с одинаковым значением, если же в множестве уже есть элемент с таким значением, он добавлен не будет. Однако структура multiset поддерживает множественные вхождения одного и того же элемента.

3. Поиск элемента.

Существует несколько различных функций для поиска элементов в set. Вот они:

size_type count(const Key& key ) const;

Считает количество вхождений элемента с ключом key в контейнер. Очевидно, что в силу свойств контейнера, эта функция возвращает либо 0, либо 1. Работаетза O(logn).

iterator find(const Key& key );

Находит элемент с ключом key. Если элемент найден, возвращает итератор на него, иначе на end() контейнера. Работаетза O(logn).

iterator lower_bound(const Key& key );

Возвращает итератор на первый элемент в множестве, который больше, либо равен искомому. O(logn).

iterator upper_bound(const Key& key );

Возвращает итератор на первый элемент в множестве, который строго больше искомого. O(logn).

Для правильного использования этих функций, надо вызывать их как функции-члены контейнера.

set<int> t;

lower_bound(t.begin(), t.end(), number);  // Неправильно!

t.lower_bound(number);                    // Правильно!

4. Удаление.

Существует также перегруженная функция erase(), которая позволяет удалять элементы. Вот её основные варианты:

iterator erase( const_iterator position );

Удаляет элемент, находящийся в позиции, указанной итератором. Амортизированнаясложность — O(1).

size_type erase( const key_type& key );

Удаляет все элементы с ключевым значением key. Понятно, что, если это просто set, а не multiset, кол-во таких элементов не превышает 1. Работаетза O(logn + count(key)).

void erase( iterator first, iterator last );

Удаляет все элементы в диапазоне [first;last). Работаетза O(logn + distance(first, last)).



2019-11-13 330 Обсуждений (0)
Функция с переменным числом аргументов 0.00 из 5.00 0 оценок









Обсуждение в статье: Функция с переменным числом аргументов

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (330)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.006 сек.)