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;
        }
    };