提问者:小点点

std::chrono在std::vector中工作不正常


我写了一个类,它每秒钟执行一些操作。 这是:

using namespace std::chrono;
class TimerTest
{
public:
    TimerTest()
    {
        m_start = steady_clock::now();
    }
    void update() // is called every iteration of the main loop
    {
        if (duration_cast<seconds>(steady_clock::now() - m_start) >= m_duration)
        {
            m_start = steady_clock::now();
            std::cout << 1; // some action
        }
    }
private:
    time_point<steady_clock> m_start;

    duration<double> m_duration = seconds(1);
};

当它由一个单独的变量定义时,它可以正常工作:

int main()
{
    TimerTest timer_test;
    while (true)
    {
        timer_test.update();
    }
}

每秒“%1”都会打印到控制台。 但是问题出现了,当我把我的类放到一个向量中时:

int main()
{
    std::vector<TimerTest> vec;
    vec.push_back(TimerTest());
    
    while (true)
    {
        for (auto i : vec)
        {
            i.update();
        }
    }
}

在向量中,此如果(duration_cast(steady_clock::now()-m_start)>=持续时间)行工作错误,并且自上次m_start更新以来所经过的时间总是大于M_duration。 因此,每次循环迭代都将“1”打印到控制台。 我真的很想知道这种奇怪行为的原因以及如何解决它。 可能我对向量有些不了解,因为我对C++不是很有经验。 所以,请帮我理解一下。


共1个答案

匿名用户

基本问题是,基于for循环的范围是创建TimerTest的副本,并更新该副本而不是原始副本。 试试。。。

for (auto &i: vec) {
    i.update();
}