-2

私の質問は、 と の 2 つの引数があるということvector<int>& ivecですconst int& numb。排除する方法はありconst int& numbますか?ベクトル内のすべての要素に 10 を追加したいだけです。ifまた、空なので一部を削除したいです。前もって感謝します。再帰的に実行してください。私の目標は、再帰関数でできるだけ少ない引数を使用することです。

#include <iostream>
#include <vector>
using namespace std;
vector<int> addten(vector<int>& ivec, const int& numb) {
  if (numb == 0) {

  } else { 
    ivec[numb - 1] += 10;
    addten(ivec, numb - 1);
  }
    return ivec;
}
4

1 に答える 1

5

あなたのコードは非常に奇妙に感じます。これを行う C++ の方法は次のようになります。

std::vector<int> vec; // your vector
// adds 10 in place
std::transform(vec.begin(), vec.end(), vec.begin(), 
               std::bind(std::plus<int>(), _1, 10));
// adds 10 out-of-place 
std::vector<int> result;
std::transform(vec.begin(), vec.end(), std::back_inserter(result),
               std::bind(std::plus<int>(), _1, 10));

あなたが具体的に要求したように、イテレータではなく上でのみ動作する非常に貧弱な foldlC++ を実装しました。vector<T>

#include <vector>
#include <iostream>

// well, here comes C++ origami
template<typename Start, typename F, typename T>
Start foldl(Start s, F f, const std::vector<T>& v) {
  return foldl_impl(s, f, v, 0);
}

template<typename Start, typename F, typename T>
Start foldl_impl(Start s, F f, const std::vector<T>& v, 
                 typename std::vector<T>::size_type t) {
  if(t == v.size()) return s;
  typename std::vector<T>::size_type t2 = t++;
  return foldl_impl(f(s, v[t2]), f, v, t);
}


int main()
{
  std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7};

  std::vector<int> added = 
    foldl(std::vector<int>()
          , [](std::vector<int>& v, int i) { v.push_back(i+10); return v;}
          , vec);
  for(auto x : added) { 
    std::cout << x << std::endl;
  }

  return 0;
}

これは優れた C++ スタイルとはかけ離れていることを考慮してください。

于 2012-05-02T20:57:58.810 に答える