Обобщить функцию вывода для стандартных контейнеров библиотеки

0

Я играл с шаблонами. Используя их, можно абстрагироваться от типа контейнера, например ниже вектор может быть любым типом POD.

template<class T>
void show(vector<T> &a) {
typename vector<T>::iterator end = a.end(), start = a.begin();
  for(start; start!= end; start++) {
      cout<<*start<<" ";
   }
 }

Я использую его так: vector<int> vect_storage; show(vect_storage); vector<int> vect_storage; show(vect_storage);

Интересно, можно ли создать такой метод show, который мог бы показывать не только вектор, но и карту, список, dequeue из библиотеки STL?

Теги:
templates
stl

3 ответа

2
Лучший ответ

Вместо того, чтобы принимать контейнер в качестве параметра, возьмите пару итераторов:

template <typename Iter>
void show(Iter first, Iter last) {
  while (first != last) {
    cout << *first++;
  }
}

vector<int> v;
show(v.begin(), v.end());
deque<int> d;
show(d.begin(), d.end());
int arr[10];
show(begin(arr), end(arr));
  • 0
    Ошибка, нет соответствующей перегрузки для pair<const K, T> ...
  • 0
    @KerrekSB: ну, конечно, сначала вам нужен подходящий operator<< overload, способный печатать один элемент, прежде чем вы сможете напечатать контейнер из них.
Показать ещё 1 комментарий
1
template<typename Cont> void show(Cont c) {
    copy(cbegin(c), cend(c), ostream_iterator<decltype(*cbegin(c))>(cout, " "));
}
0

Ваше решение уже очень близко. Просто удалите спецификацию вектора как таковой и она будет работать.

template<typename T> void show(T& a)
{
    auto end = a.end();
    auto start = a.begin();
    for(start; start != end; start++)
    {
        cout << *start << " ";
    }
}

int main(int, char**)
{
    vector<int> a(2,100);
    show(a);
    list<double> b(100, 3.14);
    show(b);
    return 0;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню