在地图中搜索结构元素

时间:2019-05-28 11:27:22

标签: c++ dictionary

我是C ++(也是英语)的新手。 我想在地图中搜索{1,2,3},如果存在,则在屏幕上打印TRUE 但是我不能 我的代码如下 你能帮我吗?

#include <iostream>
#include <map>
#include <iterator>
#define PKT_UNIT_MAX_LEN  10000
using namespace std;

struct PKT_UNIT
{
int len;
unsigned int checksum;
unsigned char data[PKT_UNIT_MAX_LEN];


};

int main()
{
 map<int,PKT_UNIT> maharan;
 maharan.insert(pair<int,PKT_UNIT>(1,{1,2,3}));

 map<int,PKT_UNIT> ::iterator it;
 it=maharan.begin();

 for(it=maharan.begin(); it != maharan.end(); it++ )
 {

  if (maharan.find(it)!=maharan.end())
  {
   if (it->second.len==1 && it->second.checksum==2 && it->second.data==3)
   cout<<"TRUE"<<endl;

  }

return 0;
}

2 个答案:

答案 0 :(得分:0)

您应该重载PKT_UNIT的相等运算符。然后,您应该只使用std::map::find来查找所需内容。

bool operator==(const PKT_UNIT& lhs, const PKT_UNIT& rhs)
{
    return (lhs.len == rhs.len) &&
           (lhs.checksum == rhs.checksum) &&
           std::equal(lhs.data,lhs.data + PKT_UNIT_MAX_LEN,rhs.data);
}

您可以执行以下操作:

PKT_UNIT goal {1,2,3};
for (const auto& e : maharan)
{
    if (e.second == goal)
    {
        std::cout << "TRUE\n";
        break;
    }
}

此外,似乎您不需要密钥,也许您想使用std::set并使用搜索算法,或者使用std::unordered_set,在这种情况下,您不需要搜索算法完全没有。

答案 1 :(得分:0)

map::find采取的措施与key_type类似,而不是mapped_type,当然也没有迭代器。搜索值不是std::map设计要支持的值。您可以改用generic searching algorithms

bool operator==(const PKT_UNIT& lhs, const PKT_UNIT& rhs)
{
    return (lhs.len == rhs.len) 
        && (lhs.checksum == rhs.checksum) 
        && std::equal(lhs.data, lhs.data + lhs.len, rhs.data);
}

int main()
{
    PKT_UNIT needle{1,2,3};
    std::map<int,PKT_UNIT> maharan;
    maharan.insert(pair<int,PKT_UNIT>(1,needle));

    auto it = std::find_if(maharan.begin(), maharan.end(), [&needle](auto & item){ return item.second == needle; });
    if (it != maharan.end())
    {
        std::cout << "TRUE";
    }

    return 0;
}