[ create a new paste ] login | about

Link: http://codepad.org/p6Nf23rx    [ raw code | output | fork ]

C++, pasted on Oct 30:
#include <algorithm>
#include <functional>
#include <vector>
#include <iterator>
#include <locale>
#include <iostream>

template <typename T>
struct finder : public std::unary_function<T, bool>
{
	typedef typename std::iterator_traits<typename T::value_type::first_type>::value_type value_type;

	finder(value_type v) : v_(v) {}
	
	bool operator()(const typename T::value_type& v) const
	{
		return *v.first == v_;
	}

	const value_type v_;
};

template <typename T>
void mutate_sequance(T begin, T end)
{
	typedef typename std::iterator_traits<T>::value_type value_type;	
	
	typedef std::vector<std::pair<T, T> > V;
	V v;
	
	T curr = begin, next;
	for(; (next = std::adjacent_find(curr, end, std::not2(std::equal_to<value_type>()))) != end; curr = ++next)
	{
		v.push_back(std::make_pair(curr, next+1));
	}

	v.push_back(std::make_pair(curr, next));

	typename V::iterator _1 = std::find_if(v.begin(), v.end(), finder<V>(2));
	typename V::iterator _2 = std::find_if(v.begin(), v.end(), finder<V>(5));
	std::iter_swap(_1, _2);

	std::cout << "После:\t";
	for (typename V::const_iterator it = v.begin(); it != v.end(); ++it)
		std::copy(it->first, it->second, std::ostream_iterator<value_type>(std::cout, " "));
	std::cout << std::endl;
}

int main()
{
	setlocale(LC_ALL, "");
	int arr[] = {1,1,1,2,3,3,4,4,4,5,5,5,6};
	const int N = sizeof(arr) / sizeof(arr[0]);

	std::vector<std::pair<const int*, const int*> > v;

	std::cout << "До:\t";
	std::copy(arr, arr+N, std::ostream_iterator<int>(std::cout, " "));
	std::cout << std::endl;

	mutate_sequance(arr, arr+N);

	return 0;
}


Output:
1
2
До:	1 1 1 2 3 3 4 4 4 5 5 5 6 
После:	1 1 1 5 5 5 3 3 4 4 4 2 6 


Create a new paste based on this one


Comments: