std::chrono 在 std::vector 中无法正常工作
std::chrono is not working properly in std::vector
我写了一个 class,每秒执行一些操作。在这里:
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”打印到控制台。
但是问题出现了,当我把我的 class 放到一个向量中时:
int main()
{
std::vector<TimerTest> vec;
vec.push_back(TimerTest());
while (true)
{
for (auto i : vec)
{
i.update();
}
}
}
在向量中,此 if (duration_cast<seconds>(steady_clock::now() - m_start) >= duration)
行出错,自上次 m_start
更新以来经过的时间总是大于 m_duration
。因此,循环的每次迭代都会将“1”打印到控制台。
我真的很想知道这种奇怪行为的原因以及如何解决它。也许我对向量一无所知,因为我对 C++ 不是很有经验。
所以,请帮助我理解它。
基本问题是基于范围的 for 循环正在制作 TimerTest
的副本并更新副本而不是原始副本。尝试...
for (auto &i: vec) {
i.update();
}
我写了一个 class,每秒执行一些操作。在这里:
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”打印到控制台。 但是问题出现了,当我把我的 class 放到一个向量中时:
int main()
{
std::vector<TimerTest> vec;
vec.push_back(TimerTest());
while (true)
{
for (auto i : vec)
{
i.update();
}
}
}
在向量中,此 if (duration_cast<seconds>(steady_clock::now() - m_start) >= duration)
行出错,自上次 m_start
更新以来经过的时间总是大于 m_duration
。因此,循环的每次迭代都会将“1”打印到控制台。
我真的很想知道这种奇怪行为的原因以及如何解决它。也许我对向量一无所知,因为我对 C++ 不是很有经验。
所以,请帮助我理解它。
基本问题是基于范围的 for 循环正在制作 TimerTest
的副本并更新副本而不是原始副本。尝试...
for (auto &i: vec) {
i.update();
}