C++是修改这些对象的向量中所有对象的给定成员的最佳方法
C++ best way to modify a given member of all objects in a vector of these objects
我有一个对象的std::vector
。对于向量中的每个对象,我希望修改对象成员的值。我想到了以下想法:
-
如果我有一个基元的向量,我会使用
std::fill
来实现这一点。但是,我无法想象如何将std::fill
应用于对象的向量。 -
我知道我肯定可以使用迭代器对所有对象进行迭代,但这对于一个小任务来说太多了。
修改std::vector
中所有对象的对象成员值的最佳方法是什么
我认为您可以使用lambda来处理这个问题;就像这样:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int temp = 10;
vector<int> ivec = {30, -10, -20, 50, 40 ,100, -50};
std::for_each(ivec.begin(), ivec.end(), [&](int &x) { x += temp; cout << x << endl;});
return 0;
}
但是只有c11支持lambda,您必须确保您的编译器支持c11
如果您想避免使用迭代器的for循环,您有多种方法。
具有函子结构的std::for_each
:
struct Functor
{
Functor(int new_value)
{
_new_value = new_value;
}
void operator()(Object& object)
{
object.modify = _new_value;
}
int _new_value;
};
std::for_each(objects.begin(), objects.end(), Functor(1));
std::for_each
,功能:
void function_modify(Object& object)
{
object.modify = 2;
}
std::for_each(objects.begin(), objects.end(), function_modify);
带λ的std::for_each
:
std::for_each(objects.begin(), objects.end(), [](Object& object) { object.modify = 3; } );
循环的c++11:
for (auto& object: objects) { object.modify = 4; }
http://ideone.com/n1SNnL
我可能不太了解您的需求,但如果您想影响vector
元素的每个相同字段的值,以下是一些方法:
struct MyStruct
{
int a;
char b;
};
int main(int argc, char const *argv[])
{
std::vector<MyStruct> myVector;
//... Fill the vector
// First way
for(std::vector<MyStruct>::iterator vIt = myVector.begin() ; vIt != myVector.end() ; ++vIt)
vIt->a = 42;
// C++11
for(auto vIt = myVector.begin() ; vIt != myVector.end() ; ++vIt)
vIt->a = 42;
// Also C++11
for(MyStruct& vElement : myVector)
vElement.a = 42;
// Even more C++11
for(auto& vElement : myVector)
vElement.a = 42;
return 0;
}
遗憾的是,我所能想到的就是迭代对象。如果你不想使用迭代器,你可以试试for_each。
例如
std::vector<Object> v( 10, Object() );
for ( Object &obj : v ) obj.member = value;
或
std::vector<Object> v( 10, Object() );
std::for_each( v.begin(), v.end(), []( Object &obj ) { obj.member = value; } );
或
Object obj;
obj.member = value;
std::vector<Object> v( 10, obj );
或
std::vector<Object> v;
Object obj;
obj.member = value;
v.assign( 10, obj );
如果循环不可取,可以执行此
class myClass
{
int a; // Variable to be modified
public:
myClass (const myClass&t)
{
a = 5;// assumed value to be set
}
myClass& operator=()
{
a = 5;// assumed value to be set
return *this;
}
myClass& operator*()
{
a= 5; // assumed value to be set
return *this;
}
};
这将确保在使用对象之前设置该值,从而部分解决您的问题。
相关文章:
- 使用std::函数映射对象方法
- 正在调用shared_ptr对象方法
- 检查哪个对象调用了另一个对象的对象方法
- 如何在C++中循环访问未知对象方法?
- c++ 替换调用对象方法的宏函数
- 我能否通过将函数实现为类对象方法来避免使用互斥锁
- 我可以制作一个对象方法,如果单独调用,它将自行修改,但如果在复制初始化期间调用,则会返回一个新对象?
- 如何让两个不同的对象方法相互用作参数
- 在创建 c++ 期间调用对象方法
- 扩展中的日期时间对象方法C++问题
- 将对象方法从向量应用于C 的第二个向量中的对象
- 将 C++/CLI 对象指针传递给本机对象方法
- 多态性的面向对象方法
- 将对象方法传递到变量
- C :使用Main中定义的对象方法的函数
- 有关使用矢量迭代器访问对象方法的问题
- 定义可以执行对象方法和独立函数的函数时出现问题
- 调用列表中子对象方法的最佳方法
- main.cpp:(.text+0x8f):对[对象方法]的未定义引用
- cpp 从需要超类对象的函数访问子类对象方法