在 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) 搜索不是问题,则使用 QList
或 std::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);
假设我有一个结构体 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) 搜索不是问题,则使用 QList
或 std::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);