#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <array>
#include <cstdint>
#include <iomanip>

template <typename Iter>
std::string hex_str(Iter begin, Iter end)
{
	std::ostringstream output;
	output << std::hex << std::setw(2) << std::setfill('0');
	while(begin != end)
		output << static_cast<unsigned>(*begin++);
	return output.str();
}

template<typename C>
std::string hex_str(const C &data) {
    return hex_str(data.begin(), data.end());
}

int main() {
	std::array<uint8_t, 5> arr = {0x48, 0x65, 0x6c, 0x6c, 0x6f};
	std::cout << hex_str(arr.begin(), arr.end()) << std::endl;
	std::cout << hex_str(arr) << std::endl;

	std::vector<uint8_t> vec = {0x48, 0x65, 0x6c, 0x6c, 0x6f};
	std::cout << hex_str(vec.begin(), vec.end()) << std::endl;
	std::cout << hex_str(vec) << std::endl;
}