【问题标题】:std::chrono is not working properly in std::vectorstd::chrono 在 std::vector 中无法正常工作
【发布时间】:2020-07-26 13:06:02
【问题描述】:

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

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

在向量中,这条if (duration_cast&lt;seconds&gt;(steady_clock::now() - m_start) &gt;= duration) 行工作错误,并且自上次m_start 更新以来经过的时间总是大于m_duration。因此,每次循环迭代都会将“1”打印到控制台。 我真的很想知道这种奇怪行为的原因以及如何解决它。也许我对向量一无所知,因为我在 C++ 方面不是很有经验。 所以,请帮助我理解它。

【问题讨论】:

  • for (auto i : vec) 这里i 是向量元素的副本。你想要for (auto &amp;i : vec)

标签: c++ vector timer chrono


【解决方案1】:

基本问题是您的基于范围的 for 循环正在复制 TimerTest 并更新副本而不是原始文件。试试……

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

【讨论】:

  • 非常感谢!没想到错在这个地方。
猜你喜欢
  • 1970-01-01
  • 2018-03-24
  • 2016-05-19
  • 1970-01-01
  • 2014-05-08
  • 1970-01-01
  • 1970-01-01
  • 2015-06-04
  • 2019-10-10
相关资源
最近更新 更多