使用c++ 11 Lambda函数更改vector(list, deque…)中的所有元素
Changing all elements in vector(list, deque...) using C++11 Lambda functions
我有以下代码:
#include <iostream>
#include <vector>
#include <algorithm>
int main( int argc, char* argv[] )
{
std::vector< int > obj;
obj.push_back( 10 );
obj.push_back( 20 );
obj.push_back( 30 );
std::for_each( obj.begin(), obj.end(), []( int x )
{
return x + 2;
} );
for( int &v : obj )
std::cout << v << " ";
std::cout << std::endl;
return 0;
}
结果为:10,20,30
我想改变vector (obj)中的所有元素,使用新的c++ 11标准的Lambda函数。
for_each
函数的实现代码:
template<class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function f)
{
for ( ; first!=last; ++first )
f(*first);
return f;
}
*首先通过值传递,元素的范围被改变,我必须使用的for_each
的替代方案是:12,22,32
我想改变vector (obj)中的所有元素,使用新的c++ 11标准的Lambda函数。
你必须这样做:
std::for_each( obj.begin(), obj.end(), [](int & x)
{ //^^^ take argument by reference
x += 2;
});
在您的(不是我的)代码中,lambda的返回类型推断为为int
,但返回值被忽略,因为没有人使用它。这就是为什么在我的代码中没有返回语句,并且此代码的返回类型推断为void
。
for
循环比std::for_each
更简单:
for( int &v : obj ) v += 2;
你应该使用transform
:
std::transform( obj.begin(), obj.end(), obj.begin(), []( int x )
{
return x + 2;
} );
通过引用传递实参,并修改引用:
std::for_each( obj.begin(), obj.end(), [](int & x){ x += 2; } );
// ^^^^^
std::for_each( obj.begin(), obj.end(), []( int& x )
{
x += 2;
} );
除了已经存在的(并且完全正确的)答案之外,您还可以使用现有的lambda函数,它返回结果而不是修改参数,并且只使用std::transform
而不是std::for_each
:
std::transform(obj.begin(), obj.end(), obj.begin(), []( int x )
{
return x + 2;
} );
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- Deque 中元素的随机访问如何提供恒定的时间复杂度?
- 我创建了deque<CObject*>并添加了不同类型的元素。如何更改此元素的属性?
- 如何仅将新添加的元素复制到std :: Deque中
- Deque 不会超过 255 个元素
- 将STL Deque重新分配我的元素(C )
- 从包含贴图的deque中删除元素
- 将std::deque的现有元素推到前面
- 如何确定 deque 的元素是否具有两个以上的相同值
- 如何在for循环中同时使用deque的两个连续元素
- 动态deque中的C++元素
- 为什么std::deque在默认构造函数中为它的元素分配内存?
- 使用c++ 11 Lambda函数更改vector(list, deque…)中的所有元素
- 在c++ 11中从std::deque中移动一个元素
- 如何将函数应用于deque的每个元素
- 删除deque的vector元素的c++错误
- 如何在std::deque中获得元素的索引?
- 使用std::deque::iterator (c++ STL)搜索和删除某些元素
- 在windbg中查找stl deque的元素计数
- Deque使用front()打印后元素而不是前元素