Wersja trochę nowocześniejsza czyli c++14.
#include <iostream>
#include <random>
#include <string>
#include <algorithm>
#include <iterator>
#include <functional>
#include <vector>
template<typename RandomAccessContainer>
void showContainer(const RandomAccessContainer& values, const std::string& msg)
{
using value_t = typename RandomAccessContainer::value_type;
std::cout << msg << " [ ";
std::copy(values.cbegin(), std::prev(values.cend()),
std::ostream_iterator<value_t>(std::cout, ", "));
std::cout << *values.crbegin() << " ]\n";
}
template<typename T>
auto makeRandomGenerator(T from, T to)
{
std::random_device rd;
std::mt19937 generator(rd());
std::uniform_int_distribution<T> distribution(from, to);
return std::bind(distribution, generator);
}
template<typename Generator, typename Container = std::vector<int>>
auto makeFilledContainer(size_t length, Generator generator)
{
Container container(length);
std::generate(container.begin(), container.end(), generator);
return container;
}
template<typename Predicate, typename Container = std::vector<int>>
auto segregateContainer(const Container& container, Predicate predicate)
{
Container yesContainer;
Container noContainer;
std::for_each(container.cbegin(), container.cend(),
[&](auto value) {
predicate(value) ?
yesContainer.push_back(value) : noContainer.push_back(value);
});
return std::make_tuple(yesContainer, noContainer);
}
int main()
{
auto randomGenerator = makeRandomGenerator(0, 100);
auto vec = makeFilledContainer(20, randomGenerator);
decltype(vec) triples;
decltype(vec) others;
std::tie(triples, others) = segregateContainer(vec,
[](auto v) { return ! (v % 3); });
showContainer(vec, "Zawartość kontenera to: ");
showContainer(triples, "Liczby podzielne przez 3 to:");
showContainer(others, "Liczby inne to: ");
}
Mały błąd w predykacie poprawiony.