删除列表中的旧值并添加新值

时间:2013-08-26 04:16:48

标签: c++ qt list queue

我真的不确定如何正确解释,但让我试试。我有一个C ++程序正在监听CAN总线上的数据(车辆通信总线)。每隔1秒,我从总线上收到一条新消息,其中包含有关错误消息的诊断信息。消息长度不固定,因此消息一次可能包含5个故障,下次可能包含3个故障。消息来自两个(或更多)不同的源,每个源每1秒发送一次。在我的UI中,我需要以每5秒1次的速率循环显示活动故障列表。

这是我的问题。如何有效地使用最新信息更新列表?添加到列表没有问题,但如何删除不应该在列表中的项目?换句话说,如果我只在消息中收到3个错误,那意味着它们中的2个不再存在。我唯一能想到的是使用时间戳和一堆for循环来比较2条消息并添加/删除/更新列表。对于这类事情,是否存在更高效的东西?

编辑:为了澄清,我需要从列表中删除项目,因为这些错误不再有效。如果我有一个数组如下:

// Message that is received: (psudo code)
Fault newFaults1[5] { Fault1, Fault2, Fault3, Fault4, Fault5 };
Fault newFaults2[7] { Fault1, Fault2, Fault3, Fault4, Fault5, Fault6, Fault7 };

// Populate the array that holds both array values
for (int i = 0; i  < newFaults1.Count(); i++)
    Faults[i] = newFaults1[i];

for (int i = 0; i < newFaults2.Count(); i++)
    Faults[i + newFaults1.Count()] = newFaults2[i];

// Now, the next time a message is received, there are fewer faults.
Fault newFaults1[2] { Fault1, Fault2 };
Fault newFaults2[1] { Fault1 };

// TODO: How do I remove all of the old items in the Faults array?

2 个答案:

答案 0 :(得分:0)

好的,我认为问题可能比最初出现的问题简单得多。您的问题似乎是关于如何调整数组的大小?

简单的答案不是使用数组而是使用std::vector。 E.g。

#include <vector>
std::vector<Fault> faults;

// add a fault to vector
faults.push_back(f);

// remove all faults from vector
faults.clear();

// resize the faults vector
faults.resize(2);

// get size of vector
num = faults.size();

// loop through all faults
for (i = 0; i < faults.size(); ++i)
{
    f = faults[i];
    // do something with f
}

如果我误解了道歉。

答案 1 :(得分:0)

目前还不是很清楚。如果您收到的新故障代表当前状态,那么您可以清除旧数组,并将新故障推送到它们中,例如:

onNewFaultsReceived(Faults *faults) {
    clear old Faults array;
    insert faults into Faults array