質問
長々と書きましたがループC++を与えてくれるものでありさえす6ランダムに数店舗を配列に格納します。何をしたいと思っている和の要素を配列で取得した値より大きな数"x"でも紹介しちゃいたいと思いますことなくすべての要素を追加.目的は最初の要素への価値。
例えば、配列が [1,2,3,4,5,6]
, は、 x = 6
, なんだっていると言っても過言ではあり要素の [1,2,3]
.
私の場合の近似式は以下のようにな標準ライブラリとしての和からの"valarray"こうの総和します。そのアイデアをどうコードでこの成功のうぞよろしくお願い申し上げます。
解決
追加を行いファンクタを書くます。
#include <algorithm>
struct SumToo
{
SumToo(int val):m_val(val),m_sum(0) {}
int m_val;
int m_sum;
bool operator()(int next)
{
m_sum += next;
return m_sum >= m_val;
}
};
int main()
{
int data[] = {1,2,3,4,5,6};
int* find = std::find_if(data,data+6,SumToo(6));
}
他のヒント
私は(質問が少し曖昧だった)それらの和が閾値を満たすか超えアップまで、あなただけの配列の最初のXの要素をしたいと仮定しています。
もしそうなら、私はあなた自身のループせずにそれを行う方法がわからない。
int sum = 0;
int i = 0;
for( ; i < len; ++i ) {
sum += array[i];
if( sum >= 6 ) {
break;
}
}
今、「i」は合計が会ったり、しきい値を超えた時にインデックスが含まれています。
を回避する答えることを示唆するものもみられる使用find_ifる状態であったが,.ステート述語危険としてのSTLアルゴリズムを仮定することはで述語コピー.この場合、コピーされたのであったが,それと異なっている場合には運動量計"とは必ずしも法全ての値、または正しいです。
特に避けるソリューションを実施し、その述語のオペレーター()会員として、定数のメンバー関数がラベルにその会員として変更可能なところまで考えるのではない状態の述語である。
んらいずれか一つの答えだけでループをこの答えを見つけ、その答えを使用するアキュムレータは、その訂正について教えてください(た場合でも、コードを目の夜にはり不格好になる。
この警告にも適用しないでCで配列やfind_if;んでいる状態の述語の解決の問題でありま利用する誤解が危険です。
参考:C++符号化規格:101特に定めた規範、ガイドラインおよびベストプラクティス87
ここでは、もう少し一般的なバージョンがあります
#include <iostream>
#include <algorithm>
// return an iterator _Last such that sum
// of all elements in the range [_First, _Last)
// satisfies the predicate Func
template<class InIt,
class Ty,
class Fn> inline
InIt accumulate_if(InIt First, InIt Last, Ty Val, Fn Func)
{
for (; Func(Val) && First != Last; ++First)
Val = Val + *First;
return (First);
}
int main() {
int num[] = {1, 2, 3, 4, 5, 6};
int *last = accumulate_if(num, num + sizeof num / sizeof num[ 0 ],
0, std::bind2nd(std::less<int>(), 6));
std::copy(num, last, std::ostream_iterator<int>(std::cout, "\n"));
return 0;
}
、のX のから一つずつ数字を引きます。
あなたが望んだとして添加なし、:)
ここでは、この作品を望んでいます:
/* Returns an index i, given array valarray[0,1..n] and number x where i is an index to valarry such that sum over j of valarray[j] for j = 0 to i > x */
int getFirstSum(int *valarray, int n, int x)
{
int i = 0;
int sum = x;
while(sum > x && i < n)
{
i++;
sum -= valarray[i];
}
return i;
}
は次のようなものになるだろう
struct StopAtValue{
StopAtValue(int sum) : m_sum(sum), m_accumulated(0){}
bool operator()(int val){
m_accumulated += val;
return m_accumulated >= sum;
}
int m_sum;
int m_accumulated;
}
int* pos = std::find_if(&array[0], &array[n], StopAtValue(6));
さて、私はベクトルを使用します。
T addUntil(T array[],size_t len,T thres){
vector<T> vec = vector_from_array(array,len)
T sum;
for (size_t i=0;i< vec.size(),sum<thresh;i++){
sum+= vec[i];
}
return sum;
}
Tを定義する<演算子+、オペレータが必要になります。
あなたがでたり、トップの上にあなたを置く要素を発見したファンクタからのみreturtn真のランニング合計を維持ファンクタと一緒のstd :: find_if()を使用し、可能性があります。
例
#include <cstdlib>
#include <algorithm>
#include <functional>
#include <iostream>
#include <string>
using namespace std;
// functor returns true when the running total >= findVal
struct running_total : public unary_function<int, bool>
{
running_total(int findVal) : findVal_(findVal), runningTtl_(0) {};
bool operator()(int rhs) const
{
runningTtl_ += rhs;
if( runningTtl_ >= findVal_ )
return true;
else
return false;
}
private:
mutable int runningTtl_;
const int findVal_;
};
int main()
{
int nums[] = {1, 2, 3, 4, 5, 6};
size_t count = sizeof(nums)/sizeof(nums[0]);
const int scanTtl = 6; // running total to scan to
int * pos = find_if(&nums[0], &nums[0]+count, running_total(scanTtl));
cout << "Elements Totaling " << scanTtl << " : ";
copy(&nums[0], pos+1, ostream_iterator<int>(cout, ", "));
return 0;
}