Like ronag's answer is a more general version:
template<typename C, typename Op> void each_unique_pair(C& container, Op fun) { for(auto it = container.begin(); it != container.end() - 1; ++it) { for(auto it2 = std::next(it); it2 != container.end(); ++it2) { fun(*it, *it2); fun(*it2, *it); } } }
UPDATE
template<typename C, typename O1, typename O2> void each_value_and_pair(C& container, O1 val_fun, O2 pair_fun) { auto it = std::begin(container); auto end = std::end(container); if(it == end) return; for(; it != std::prev(end); ++it) { val_fun(*it); for(auto it2 = std::next(it); it2 != end; ++it2) { pair_fun(*it2, *it); pair_fun(*it, *it2); } } }
What is used as follows:
main() { std::vector<char> values; // populate values // .... each_value_and_pair(values, [](char c1) { std::cout << "value: " << c1 << std::endl;}, [](char c1, char c2){std::cout << "pair: " << c1 << "-" << c2 << std::endl;}); }
source share