C++是修改这些对象的向量中所有对象的给定成员的最佳方法

C++ best way to modify a given member of all objects in a vector of these objects

本文关键字:对象 方法 最佳 成员 向量 修改 C++      更新时间:2023-10-16

我有一个对象的std::vector。对于向量中的每个对象,我希望修改对象成员的值。我想到了以下想法:

  1. 如果我有一个基元的向量,我会使用std::fill来实现这一点。但是,我无法想象如何将std::fill应用于对象的向量。

  2. 我知道我肯定可以使用迭代器对所有对象进行迭代,但这对于一个小任务来说太多了。

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

这将确保在使用对象之前设置该值,从而部分解决您的问题。