这里是您需要的内容
int rob( const vector<int>& nums) {
int i = 0;
int a = std::accumulate(nums.begin(), nums.end(), 0,
[&i]( const auto &acc, const auto &value )
{
return ( i ^= 1 ) ? acc + value : acc;
} );
std::cout <<" a: " <<a;
return a;
}
这里有一个示范程序。
#include <iostream>
#include <vector>
#include <iterator>
#include <numeric>
int rob( const std::vector<int> &nums )
{
int i = 0;
int a = std::accumulate( std::begin( nums ), std::end( nums ), 0,
[&i]( const auto &acc, const auto &value )
{
return ( i ^= 1 ) ? acc + value : acc;
} );
return a;
}
int main()
{
std::vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
std::cout << rob( v ) << '\n';
return 0;
}
它的输出是
20
您可以向函数添加一个参数,以选择是对偶数还是奇数进行求和。例如:
#include <iostream>
#include <vector>
#include <iterator>
#include <numeric>
int rob( const std::vector<int> &nums, bool odds = false )
{
int i = odds;
int a = std::accumulate( std::begin( nums ), std::end( nums ), 0,
[&i]( const auto &acc, const auto &value )
{
return ( i ^= 1 ) ? acc + value : acc;
} );
return a;
}
int main()
{
std::vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
std::cout << rob( v ) << '\n';
std::cout << rob( v, true ) << '\n';
return 0;
}
程序输出为:
20
25
在这种情况下,您可以删除变量i的声明。例如:
#include <iostream>
#include <vector>
#include <iterator>
#include <numeric>
int rob( const std::vector<int> &nums, bool odds = false )
{
int a = std::accumulate( std::begin( nums ), std::end( nums ), 0,
[&odds]( const auto &acc, const auto &value )
{
return ( odds = !odds ) ? acc + value : acc;
} );
return a;
}
int main()
{
std::vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
std::cout << rob( v ) << '\n';
std::cout << rob( v, true ) << '\n';
return 0;
}
std::remove_if
似乎是需要的。也就是说,使用std::accumulate
是正确的。修改的是迭代的范围。请参阅 http://www.cplusplus.com/reference/algorithm/remove_if/,其中有一些示例。 - Thomas Bitonti