LINUX.ORG.RU

Вопрос по С++


0

1

Здравствуйте дорогие. Подскажите пожалуйста как в данной программе сделать так чтобы функция int findMin( int value, std::array<int, 3> coins ) принимала вторым параметром массив любого размера. Подозреваю что это можно сделать через шаблоны, возможно ли? Не хотелось бы вторым параметром делать всеж таки вектор потому что пропадает замечательная красивая инициализация с помощью списка. Вот программка которая считает как с помощью минимального количества монеток заданных номиналов собрать нужную сумму:

#include <vector>
#include <array>
#include <iostream>


int findMin( int value, const std::array<int, 3>& coins )
{
	std::vector<int> mins;

	mins.assign( value + 1, 100 );

	mins[0] = 0;

	for( int i = 0; i < value + 1; ++i )
	{
		for( int j = 0; j < coins.size(); ++j )
		{
			if( ( coins[j] <= i ) && ( mins[ i - coins[j] ] + 1 < mins[i] ) )
				mins[i] = mins[ i -coins[j] ] + 1;
		}
	}

	return mins.back();
}

int _tmain(int argc, _TCHAR* argv[])
{
	const std::array<int, 3> coins = { 1, 4, 5};
	std::cout << findMin(17, coins ) << std::endl;
	std::cout << findMin(11, coins ) << std::endl;
	std::cout << findMin(7, coins ) << std::endl;
	std::cin.get();

	return 0;
}

★★

Последнее исправление: mio (всего исправлений: 1)

Не хотелось бы вторым параметром делать всеж таки вектор потому что пропадает замечательная красивая инициализация с помощью списка.

В C++11 не пропадает, а вообще забудь слово «красиво» в отношении к плюсам. Комитет стандартизации обычно не особо задумывается об облегчении восприятия кода программистом, в результате синтаксис местами просто страшен.

m0rph ★★★★★
()
Ответ на: комментарий от m0rph

А можно вообще нечто вроде:

template <class ForwardIterator, class T>
  ForwardIterator findMin ( ForwardIterator first, ForwardIterator last, const T& value )
m0rph ★★★★★
()
Ответ на: комментарий от m0rph

На 2010 студии vector так не инициализуируешь. Передать шаблонный параметр функции в шаблон параметра данной никак всеж таки?

mio ★★
() автор топика
Ответ на: комментарий от mio

Передать шаблонный параметр функции в шаблон параметра данной никак всеж таки?

Чего?

template<std::size_t N>
int findMin( int value, const std::array<int, N>& coins)
Begemoth ★★★★★
()
Ответ на: комментарий от mio

можно, но зачем?

начало и конец — стандартное решение из стандартной же библиотеки

anonymous
()

_tmain

_TCHAR

FFFFUUUUUUUUUUU!!!!!!

Не хотелось бы вторым параметром делать всеж таки вектор

забудь про Фримена красивую инициализацию, используй вектор.

nanoolinux ★★★★
()

boost::iterator_range тебя спасет

AF ★★★
()

template <typename T, size_t N> char (&ArraySizeHelper(T (&array)[N]))[N]; #define arraysize(array) (sizeof(ArraySizeHelper(array)))

int a[] = {0,1,2}; arraysize(a);

anonymous
()
template <typename T, size_t N>
char (&ArraySizeHelper(T (&array)[N]))[N];
#define arraysize(array) (sizeof(ArraySizeHelper(array)))

int a[] = {0,1,2};
arraysize(a);
serenissimus
()

или ещё один способ


template <typename T, size_t N>
int Size(const (&array)[N])
{
    return N;
}

serenissimus
()

Если ничего из предложенного не нравится - напишите класс с виртуальными методами для извлечения элементов массива. И создайте шаблонный класс-потомок от этого класса, который будет специализироваться разными конструкторами - стандартными контейнерами или массивами С...

Функция findMin будет конкретной, но для нее нужно будет сделать обертку шаблонную, которая будет передавать виртуальный класс

sotlef
()
Ответ на: комментарий от Jetty

Что люди не делают только бы не использовать простые конструкции :)

Что люди не делают только бы не использовать простые и мощные языки :)

;; fixed for the greater good

gensym ★★
()
Ответ на: комментарий от mio

понимаю ваше возмущение, да это vc2010

в vc2010, внезапно, можно не использовать эти tmain и TCHAR ;-)

anonymous
()

Самое красивое решение у Begemoth'a.

Не хотелось бы вторым параметром делать всеж таки вектор потому что пропадает замечательная красивая инициализация с помощью списка.

ССЗБ. VS толком не потдерживает C++11 и врядли скорым временем что-то изменится. А вот в gcc такое работает:

std::vector<int> vec = {2, 4, 6, 8, 0};

frozenix ★★★
()
Ответ на: комментарий от frozenix

ССЗБ. VS толком не потдерживает C++11 и врядли скорым временем что-то изменится. А вот в gcc такое работает:

в следующей версии VS тоже работает, нужно учитывать, что у них релизы пореже выходят

vaino
()
Ответ на: комментарий от Uter

Вроде SDK (и новые версии компиляторов) выходят почаще

нет, но они регулярно дают потестить следующую версию на стадии беты

vaino
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.