You need a helper object, like std::less
but for a unary operator.
C++11 lambdas make this incredibly easy:
std::transform(xs.begin(), xs.end(), ys.begin(), [](the_type x){ return -x; });
std::transform(xs.begin(), xs.end(), ys.begin(), [](the_type x){ return !x; });
std::transform(xs.begin(), xs.end(), ys.begin(), [](the_type x){ return ~x; });
Or, use these flexible helpers:
struct negate
{
template<typename T>
auto operator()(const T& x) const -> decltype(-x) { return -x; }
};
struct invert
{
template<typename T>
auto operator()(const T& x) const -> decltype(!x) { return !x; }
};
struct complement
{
template<typename T>
auto operator()(const T& x) const -> decltype(~x) { return ~x; }
};
std::transform(xs.begin(), xs.end(), ys.begin(), negate());
std::transform(xs.begin(), xs.end(), ys.begin(), invert());
std::transform(xs.begin(), xs.end(), ys.begin(), complement());