Zapewne odpowiesz że jeszcze tych kontenerów nie przerabiałeś, ale spróbujmy...
Jeśli miałbyś rozwiązać problem a nie ćwiczyć rozwiązanie, użyłbyś std::nth_element z <algorithm>.
#include <iostream>
#include <algorithm>
int main() {
int tab[]={8, 4, 5, 9, 3, 2, 7};
for(auto i = 0; i < 3; ++i) {
std::nth_element(std::begin(tab) + i, std::begin(tab) + i, std::end(tab));
std::cout << "minimum = " << *(std::begin(tab) + i) << '\n';
}
}
Właściwością tego rozwiązania jest modyfikacja kontenera pierwotnego.
Jeśli wymaganie było by postawione włącznie z "kontener pierwotny ma nie być zmieniony", potrzebował byś struktury która naturalnie zwróci elementy najmniejsze. Nadaje się do tego kolejka priorytetowa:
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
#include <functional>
int main() {
int tab[] = {8, 4, 5, 9, 3, 2, 7};
std::priority_queue<int, std::vector<int>, std::greater<int>> que;
std::for_each(std::begin(tab), std::end(tab), [&que](int val) { que.push(val);});
for(auto i = 0; i < 3; ++i) {
std::cout << "minimum = " << que.top() << '\n';
que.pop();
}
}
Właściwością tego rozwiązania jest konieczność alokowania 2 kontenera (std::vector dla std::priority_queue) o wielkości pierwotnego. Oczywiście łatwo dodać jego zmniejszanie do wartości 3 w każdym zasileniu que przez push(...).
Jeśli żadne z powyższych rozwiązań, to tak naprawdę manualnie będziesz implementował kolejkę priorytetową graniczoną do 3 wartości.