Здравей, отговарям последователно на въпросите ти:
А как достъпваме елементите на контейнерите след като незнаем контейнер X от какъв тип е?
Това го учихме миналия семестър :) Явно трябва да имаш някаква функция с едно и също име, която работи по различен начин за всеки тип контейнер, в зависимост от неговата организация.
Например за филтрирането трябва да проверим за всеки елемент на всеки контейнер дали отговаря на някакво условие.
Филтрирането е прекрасен пример за такава функция, която има един и същ смисъл но е реализирана по различен начин за всеки тип контейнер.
Също по точката:
Да се напише функция, която проверява дали в контейнер се
среща елемент, отговарящ на дадено условие, като условието е
дефинирано като typedef bool (*condition)(T const&);
Функцията трябва ли да проверява всеки контейнер или се подава индекс на контейнер, в който всеки елемент се проверява докато не се намери елемент отговарящ на условието?
Функцията трябва да проверява конкретен контейнер. Може да се подава както решиш: с индекс, указател, псевдоним и т.н.