for_each에 의해 허용되는 함수는 하나의 매개 변수 (벡터의 요소) 만 사용하므로 for_each를 호출 한 후 에 액세스 할 수 있도록 어딘가에 static int sum = 0
을 정의해야합니다. . 나는 이것이 어색하다고 생각한다. 이것을 수행하는 더 좋은 방법 (여전히 for_each 사용)?for_each를 사용하여 벡터의 각 요소의 제곱의 합
sum = 0
[1,2,3,4].each { |i| sum += i*i} #local variable can be used in the callback function
puts sum #=> 30
당신이 for_each
는 일반적으로 (다만 각 요소를 인쇄하지 않음) 실제 프로그래밍에서 사용되는 방법을 더 예를 보여 주시겠습니까 :
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
static int sum = 0;
void add_f(int i)
{
sum += i * i;
}
void test_using_for_each()
{
int arr[] = {1,2,3,4};
vector<int> a (arr ,arr + sizeof(arr)/sizeof(arr[0]));
for_each(a.begin(),a.end(), add_f);
cout << "sum of the square of the element is " << sum << endl;
}
, 우리는 이런 식으로 할 수 있습니까?for_each
을 사용하여지도와 같은 '프로그래밍 패턴'을 시뮬레이션하고 Ruby (또는 Haskell의지도/접기)에 삽입 할 수 있습니까?
#map in ruby
>> [1,2,3,4].map {|i| i*i}
=> [1, 4, 9, 16]
#inject in ruby
[1, 4, 9, 16].inject(0) {|aac ,i| aac +=i} #=> 30
편집 : 고맙습니다. 당신의 답장에서 나는 많은 것을 배웠습니다. 우리는 C++에서 똑같은 일을하는 방법이 너무 많아서 배우기가 조금 어렵습니다. 그러나이 흥미로운 :)
벡터 반복기가 std 네임 스페이스에 있음을 보장하지는 않습니다. 그것이 맞다면 ADL은 여기서 작동하는 것이 보장되지 않으며 질문자는 컴파일러를 지정하지 않았습니다. –
네 말이 맞아. 방금 확인했습니다. 표준은 반복기가 std 네임 스페이스의 일부임을 보장하지 않습니다. 역방향 이터레이터 만'std' 네임 스페이스의 일부입니다. –
onebyone : 와우, 잘 잡으세요. 나는 표준을 검사했고 당신은 절대적으로 옳다. 그래서 예. 벡터 :: iterator가 T *에 typedefed되면 ADL이 실제로 실패합니다. OP의 관심을 얻으려고 -100 ... (게시물은 다른 점은 그다지 우수하지 않습니다.) –