gpt4 book ai didi

c++ - 在对象 vector 中查找具有相同属性值的对象

转载 作者:行者123 更新时间:2023-11-28 04:56:59 27 4
gpt4 key购买 nike

我有一个随机对象如下

struct myObject
{
int numberOfSymbols;
std::vector<int> symbolNumbers;
std::vector<int> Pins;
std::vector<std::string> pinNumList;
std::map<std::string, std::string> pinNumNameMap;

}

std::vector<myObject> m_myObject;

然后一个函数将信息加载到这个 myObject vector 中。我需要对填充的数据进行如下完整性检查:

查看哪些对象具有相同数量的 PinspinNumNameMap,然后根据比较结果执行操作。

我不确定如何分组/查找具有相同图钉数量的对象,因为有时这个 vector 可以增长到 50-100 个对象。我是来自 C# 的 C++ 新手。在 C# 中,我们使用 lambda expressoins/iterators 等来做到这一点..不知道我们如何在 C++ 中做到这一点

最佳答案

您需要定义一个自定义 operator== 来遍历 Pins 和 pinNumNameMap(顺便说一句,我刚刚回答了另一个关于比较 vector here 中的自定义对象的问题) .

这是我想出的,尽管它可能不是您所需要的,具体取决于您是否需要 PinspinNumNameMap 中的所有条目完全匹配或如果比较容器的大小就足够了。

编辑:我将这两个部分合并为一个部分以说明可能的用途。

#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <list>
#include <functional>

struct myObject
{
int numberOfSymbols;
std::list<int> symbolNumbers;
std::list<int> Pins;
std::list<std::string> pinNumList;
std::map<std::string, std::string> pinNumNameMap;

friend bool operator == (const myObject& _this, const myObject& _other)
{
// Check if entry sizes match
if (_this.Pins.size() != _other.Pins.size() ||
_this.pinNumNameMap.size() != _this.pinNumNameMap.size())
{
return false;
}

// Now check if the things inside the entries also match
bool same(true);
for (auto this_it = _this.Pins.begin(), other_it = _other.Pins.begin(); this_it != _this.Pins.end(); ++this_it, ++other_it)
{
same &= (*this_it == *other_it);
}

for (const auto& name : _this.pinNumNameMap)
{
same &= (_other.pinNumNameMap.find(name.first) != _other.pinNumNameMap.end() &&
_other.pinNumNameMap.at(name.first) == name.second);
}
return same;
}

};

// std::reference_wrapper is used when you want to
// store references to objects in a container like
// std::vector (you can't store myObject&)
typedef std::reference_wrapper<myObject> ObjRef;

int main()
{

std::vector<myObject> m_myObject;

// This is your comparison object.
// Use this to identify objectsin the original
// container with matching Pins and pinNumNameMaps.
myObject tmp;
tmp.Pins = {1, 2, 3};
tmp.pinNumNameMap =
{
{"pin 1", "name 1"},
{"pin 2", "name 2"},
{"pin 3", "name 3"}
};

std::vector<ObjRef> objectsWithCertainPins;

for (auto& obj : m_myObject)
{
if (obj == tmp)
{
// Use std::reference_wrapper to avoid
// copying large myObject instances
objectsWithCertainPins.emplace_back(std::ref(obj));
}
}

// Now you can iterate over objects in your
// objectsWithCertainPins container.
for (auto& obj : objectsWithCertainPins)
{
std::cout << "Pins:";
for (const auto& p : obj.get().Pins)
{
std::cout << " " << p;
}
std::cout << "\n";
}

return 0;
}

关于c++ - 在对象 vector 中查找具有相同属性值的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46943099/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com