C++ C++;在这些对象的向量中修改所有对象的给定成员的最佳方法
我有一个对象的C++ C++;在这些对象的向量中修改所有对象的给定成员的最佳方法,c++,vector,C++,Vector,我有一个对象的std::vector。对于向量中的每个对象,我希望修改对象成员的值。我想到了以下几点: 如果我有一个原语向量,我会使用std::fill来实现这一点。但是,我无法想象如何将std::fill应用于对象向量 我知道我肯定可以使用迭代器对所有对象进行迭代,但对于一个小任务来说,这是很多代码 为std::vector中的所有对象修改对象成员值的最佳方法是什么?遗憾的是,我所能想到的只是在对象上迭代。如果你不想使用迭代器,你可以试一试 我可能不太了解您的需求,但如果您想影响向量元素的每个
std::vector
。对于向量中的每个对象,我希望修改对象成员的值。我想到了以下几点:
std::fill
来实现这一点。但是,我无法想象如何将std::fill
应用于对象向量为
std::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;
}
struct MyStruct
{
INTA;
字符b;
};
int main(int argc,char const*argv[]
{
std::vector myVector;
//…填充向量
//第一条路
对于(std::vector::迭代器vIt=myVector.begin();vIt!=myVector.end();++vIt)
vIt->a=42;
//C++11
对于(自动vIt=myVector.begin();vIt!=myVector.end();++vIt)
vIt->a=42;
//也是C++11
for(MyStruct&velment:myVector)
水平a=42;
//更多的是C++11
用于(自动调整:myVector(&V)
水平a=42;
返回0;
}
我想你可以用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;
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
内部温度=10;
向量ivec={30,-10,-20,50,40,100,-50};
std::for_each(例如ivec.begin()、ivec.end()、[&](int&x){x+=temp;cout
std::vector<Object> v( 10, Object() );
for ( Object &obj : v ) obj.member = value;
向量v(10,Object());
for(Object&obj:v)obj.member=值;
或
向量v(10,Object());
std::for_each(v.begin()、v.end()、[](Object&obj){obj.member=value;});
或
objectobj;
obj.member=值;
std::向量v(10,obj);
或
std::vector v;
对象对象对象;
obj.member=值;
v、 分配(10,obj);
如果要避免使用迭代器进行for循环,可以使用多种方法
std::对于具有函子结构的每个
:
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::对于每个
功能:
void function_modify(Object& object)
{
object.modify = 2;
}
std::for_each(objects.begin(), objects.end(), function_modify);
std::对于每个带有lambda的
:
std::for_each(objects.begin(), objects.end(), [](Object& object) { object.modify = 3; } );
c++11 for循环:
for (auto& object: objects) { object.modify = 4; }
如果循环不可取,您可以这样做
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::For每一个用λ可能吗?STD::转换工作?为什么要考虑一个简单的for循环,只做一件事,“多代码”??真的不是。@RedX:是的,在minicaptain之后,我尝试了使用lambda的std::for_each
。如果没有c++11,您可以尝试BOOST_FOREACH宏,这会导致与for()相比代码更少循环。如果您在std::algorithm
解决方案中进行计数,例如使用lambda的transform
和for_每个
。感谢Oragon Efreet(+1),第三个示例对我来说非常简洁。如果我的项目中有C++11可用,我会使用它!这两个选项都需要C++11,而不仅仅是第二个。@BenjaminLindley你说得对,lambda仅是C++11。我添加了非C++11的一个(函子),谢谢你,我应用了for_(+1).Mmhh..当我最近检查编译器对C++11的支持时,正如在中所做的那样,它显示了一个“C++11之前”的版本。然而,在我看来,它工作正常并且简洁。
std::for_each(objects.begin(), objects.end(), [](Object& object) { object.modify = 3; } );
for (auto& object: objects) { object.modify = 4; }
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;
}
};