std::vector
のすべての要素を、通常の型のC++で実行されているのと同じ方法で定数で掛けて除算する必要があります。入力ベクトルが整数型の場合は整数、そうでない場合は浮動小数点型です。整数型std :: vectorを定数で除算する演算子を提供しようとしています
私はstd::multiplies
に基づいて乗算のコードを見つけ、交換std::divides
で修正しました。その結果、コードは正常に動作しますが、希望の順序ではありません。
#include <iostream>
#include <vector>
#include <algorithm>
// std::vector multiplication by constant
// http://codereview.stackexchange.com/questions/77546
template <class T, class Q>
std::vector <T> operator*(const Q c, const std::vector<T> &A) {
std::vector <T> R(A.size());
std::transform(A.begin(), A.end(), R.begin(),
std::bind1st(std::multiplies<T>(),c));
return R;
}
// My modification for division. There should be integer division
template <class T, class Q>
std::vector <T> operator/(const std::vector<T> &A, const Q c) {
std::vector <T> R(A.size());
std::transform(A.begin(), A.end(), R.begin(),
std::bind1st(std::divides<T>(),c));
return R;
}
int main() {
std::vector<size_t> vec;
vec.push_back(100);
int d = 50;
std::vector<size_t> vec2 = d*vec;
std::vector<size_t> vec3 = vec/d;
std::cout<<vec[0]<<" "<<vec2[0]<<" "<<vec3[0]<<std::endl;
// The result is:
// 100 5000 0
size_t check = vec[0]/50;
std::cout<<check<<std::endl;
// Here the result is 2
// But
std::vector<double> vec_d;
vec_d.push_back(100.0);
vec_d = vec_d/50;
std::cout<<vec_d[0]<<std::endl;
// And here the result is 0.5
return 0;
}
私の演算子は正しく書くことができますか?私はstd::bind1st
が各要素についてc
で除算を呼び出すと考えましたが、それは何とか逆になります。
編集:私は、私はループを書くことができることを理解し、私は大きな数字のための部門の多くをしたいので、私はそれが速くなりたかった...
'std :: transform'は内部的にループを使用しているので、生のループに比べてパフォーマンス上の利点はありません。 (実際には、関数呼び出しとバインドのための追加のオーバーヘッドがあるかもしれません。) – qxz
@qxzありがとう!私は参照してください... – Slowpoke
'std :: bind2nd(...)'または 'std :: bind(std :: divides()、_1、c)'が必要なようです。 –