在 QList 中查找元素

Finding element in QList

假设我有一个结构体 SignalError,它有一个元素“errName”和许多其他元素:

typedef struct SignalError
{
    QString errName;
    .....
};

我创建了这个结构的 QList:

QList<SignalError> signalErrList;

我将使用附加调用将结构元素附加到 QList。

SignalError sgErr1 = {"Error_1"};

signalerrList.append(sgErr1);

在将元素附加到列表之前,我想检查 QList 中是否已经存在具有相同名称“errName”的任何元素。如果是,那么我不会将该元素添加到列表中。 我该怎么做?

此外,我是否应该创建一个对象列表,例如:

QList<SignalError> signalErrList;

或创建指向对象的指针列表:

QList<SignalError*> signalErrList;

您应该使用 QList<SignalError> signalErrList; 而不是 QList 指针。

如果您不关心顺序,您应该使用 std::set<SignalError> 它会自动为您删除重复数据。

如果您关心顺序并且 O(N) 搜索不是问题,则使用 QListstd::vector 并执行

if (auto it = std::find(signalErrList.begin(), signalErrList.end(), sgErr1;
    it == signalErrList.end()) {
    signalErrList.push_back(std::move(sgErr1));
}

您可以(并且应该)将其命名为函数:

//! A linear-time (O(n)) search followed by push-back if not found
//! API modeled on https://en.cppreference.com/w/cpp/container/set/emplace
template <typename Container, typename Value>
std::pair<typename Container::iterator, bool>
emplaceBackLinearUnique(Container& c, Value&& v) {
    if (auto it = std::find(c.begin(), c.end(), v); it != c.end()) {
        // Return iterator to the found one and say that it wasn't emplaced.
        return { it, false }; 
    }
    // Not found:
    c.emplace_back(std::forward<Value>(v));
    // Return iterator to the new last element and report that it was emplaced:
    return { c.begin() + c.size() - 1, true };
}

让你替换。你的用例。:

emplaceBackLinearUnique(signalErrList, sgErr1);