向量中堆栈分配类的范围

时间:2015-12-01 13:51:05

标签: c++ c++11

我的课程安排如下:

#include <iostream>
#include <vector>

struct Tracker
{
    int a = 0;

    void update()
    {
       a++;
    }
};

struct OtherClass
{
    std::vector<Tracker> activeTrack;

    void updateAll()
    {
       for (Tracker tr : activeTrack) {
           tr.update();
       }
    }
};

int main()
{
    OtherClass o;
    o.activeTrack.resize(1);
    o.updateAll();  // does nothing?!

    std::cout << o.activeTrack[0].a << '\n';  // Is 0; should be 1!
}

live demo

是否有一些非常简单的事情,我不了解堆栈分配的对象在向量中的行为?

3 个答案:

答案 0 :(得分:4)

for (Tracker tr : activeTrack) {
   tr.update();
}

您每次都要制作副本,并在副本上执行update()

使用参考

for (Tracker& tr : activeTrack) {
   tr.update();
}

答案 1 :(得分:0)

默认情况下,Vector内部始终在堆上分配。为此,它会复制传递给它的内容。问题是每次复制值时基于循环的范围。

相反,您可以使用auto来获取迭代器

for( auto it = activeTrack.begin() ; it != activeTrack.end() ; ++it)
{
  it->update();
}

这样就不用担心转接问题了。

答案 2 :(得分:0)

你的迭代器是一个问题,而且你没有创建一个跟踪器实例来添加到矢量,这个工作。

#include <iostream>
#include <vector>
using namespace std;
struct Tracker
{
    int a = 0;

    void update()
    {
       a++;
    }
};

struct OtherClass
{
    std::vector<Tracker> activeTrack;

    void updateAll()
    {
       for (vector <Tracker>::iterator it = activeTrack.begin(), end=activeTrack.end(); it != end; ++it)
       it->update();
    }
};

int main()
{
    OtherClass o;
    o.activeTrack.resize(1);
    Tracker T;
    o.activeTrack.push_back(T);
    o.updateAll();  
    std::cout << o.activeTrack[0].a << '\n'; 

 }

希望有所帮助

相关问题