Re: transform
On 25 Feb, 14:26, Chris Roth <czr...@mail.usask.ca> wrote:
I'm just starting out using the algorithms in c++ std library.
I have a vector of vectors (v) and want to get a slice at some index.
ex. If v held two vectors, v1 and v2:
v1 = 1 2 3 4 5 6
v2 = 7 7 8 8 9 9
the slice at position 3 would be 3 8 (v1(3) and v2(3)).
I think it is possible to use transform to make the slice matrix, but
I'm having trouble with the final argument:
vector< vector<double> > v;
// populate v
vector<double> slice;
transform( v.begin(), v.end(), slice.begin(), ??? );
What goes in ???
I have tried std::vector<double>::at(), but it didn't work.
Thanks c++ board.
FWIW heres my efforts. Some of the stuff is home brew stuff to set up
the containers and output results but underneath you should see the
std:: stuff poking out.
regards
Andy Little
#include <vector>
#include <algorithm>
// impl functors
// to do push_back and at
namespace impl_detail{
struct at_fun{
at_fun(int n_in) : n(n_in){}
int n;
template <typename C>
typename C::value_type
operator()(C & c) const
{
return c.at(n);
}
};
template <typename Fun, typename Container>
struct push_back_fun{
Container & c;
Fun const & f;
push_back_fun(Fun const & f_in,Container & c_in):f(f_in),c(c_in)
{}
template <typename T>
struct result{
typedef void type;
};
template <typename T>
typename result<T>::type
operator()(T const & t)const
{
return c.push_back(f(t));
}
};
}
// interface functions for push_back, at
inline
impl_detail::at_fun at( int n)
{
return impl_detail::at_fun(n);
};
template <typename F,typename Container>
inline
impl_detail::push_back_fun<F,Container> my_push_back(F const &
f,Container & c)
{
return impl_detail::push_back_fun<F,Container>(f,c);
}
//home brew stuff
#include <quan/fun/for_each.hpp>
#include <quan/fun/container_push_back.hpp>
#include <quan/fun/output.hpp>
int main()
{
// ---home brew impl stuff to populate the containers---
using quan::fun::for_each;
using quan::fun::push_back;
using quan::fun::output;
std::vector< std::vector<double> > v;
double ar1[] ={ 1, 2, 3, 4 ,5 ,6};
v.push_back(std::vector<double>());
for_each(ar1,push_back(v.back()));
double ar2[] = {7, 7 ,8 ,8 ,9 ,9 };
v.push_back(std::vector<double>());
for_each(ar2,push_back(v.back()));
//---end of home brew stuff---
std::vector< std::vector<double> > result;
// using std::for_each......
for (int i = 0; i != v[0].size(); ++i){
// add a vector to result
result.push_back(std::vector<double>());
// fill it
std::for_each(
v.begin(), v.end(),
my_push_back(at(i),result.at(i))
);
//more home brew to check it worked
for_each(result.at(i),output(std::cout," "));
std::cout << '\n';
}
}