2013-12-09 59 views
0

在下面的代碼片段,任何人都可以讓我知道如何打印函數值輸出(3,4,5,6,7)沒有 在類中嵌入添加函數。輸出向量與用戶定義的功能

#include<iostream> 
#include<vector> 
#include<algorithm> 
using namespace std; 

void add (int i) 
{ 
i=i+2; 

} 

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

for_each(vec.begin(), vec.end(),add); 


for (auto i:vec) 
{ 

cout<<i; 
} 


return 1; 
} 

回答

2

改變功能採取的引用:

void add (int& i) 
{ 
    i+=2; 
} 

這將修改原始矢量。如果不想要的,然後進行復印:

vector <int> vec ={1,2,3,4,5}; 
vector<int> vec2(vec); 
for_each(vec2.begin(), vec2.end(), add); 
for (auto i : vec2) 
    cout<<i; 
+0

即使沒有參考,複製也不起作用。所以在這種情況下參考似乎只是解決方案。 – user2997518

+0

@ user2997518當然,你總是需要參考。否則,該功能根本沒有效果。 – juanchopanza

1

for_each不修改傳遞給它的元素或引用傳遞。

// Example implementation 
template<class InputIterator, class Function> 
    Function for_each(InputIterator first, InputIterator last, Function fn) 
{ 
    while (first!=last) { 
    fn (*first); 
    ++first; 
    } 
    return fn; 
} 

如果有C++ 11可以使用lambda:

for_each(vec.begin(), vec.end(),[&] (int& i) { 
    i += 2; 
}); 

否則,可以使用std::transform,與用作目的地的源向量。

std::transform(vec.begin(), vec.end(), vec.begin(), [] (int i) { 
    return i + 2; 
}); 
+0

這似乎是一個很好的方法,即使沒有參考lambda和變換作品。 – user2997518

0

爲什麼不簡單地使用std::transform()?不需要add()功能。由於發佈的add()函數沒有副作用,因此無論如何都不能使用它。

std::vector<int> vec = { 1, 2, 3, 4, 5 }; 
std::transform(vec.begin(), vec.end(), vec.begin(), 
       [](int value) { return value + 2; });