【问题标题】:c++ map finding value and associated keyc ++映射查找值和关联键
【发布时间】:2014-03-06 08:53:11
【问题描述】:

我在 C++ 中开发了一个程序,在该程序中我必须通过使用值在 stl 映射中找到键。 但是分配给 key 的值是 5 个元组 (srcip,port,destip,port,srcno)

现在我想检查地图是否有与值关联的键。 我正在尝试这样的事情。

但它的显示错误如 模板参数的数量错误。 注意(在我的程序中键-> 值)值由 5 个变量的元组组成。

template<class T>
struct map_data_compare : public std::binary_function<typename T::value_type,typename T::mapped_type,bool>
{
public:
bool operator() (typename T::value_type &pair,typename T::mapped_type i)
{
return pair.second == i;
}
}


class Values
{
private:
std::string C_addr;
int C_port;
std::string S_addr;
int S_port;
int C_ID;

public:
Values(std::string,int,std::string,int,int);
void printValues();
};


Values :: Values(std::string Caddr,int Cport,std::string Saddr,int Sport,int Cid)
{
C_addr=Caddr;
C_port=Cport;
S_addr=Saddr;
S_port=Sport;
C_ID=Cid;
}

void Values::printValues()
{
cout << C_addr<<":" <<C_port<<":" << S_addr <<":" <<S_port << ":"<<C_ID  <<endl;
}



//In main

    {

    typedef std::map<int, Values> itemsType;
    itemsType items;


    Values connection (inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port),inet_ntoa(servaddr.sin_addr),ntohs(servaddr.sin_port),clientID);



    std::map<std::int,Values>::iterator it = std::find_if( items.begin(), items.end(), std::bind2nd(map_data_compare<itemsType>(),connection));

    if ( it != items.end() )
    {
    assert( connection == it->second);
    std::cout << "Found index:" << it->first << " for values:" << it->second << std::endl;
    }
    else
    {
    std::cout << "Did not find index for values:" << connection <<endl;
    }

【问题讨论】:

  • 为什么不首先使用您定义的比较器对地图进行排序,而不是使用默认比较器进行排序,然后再次使用您自己的比较器。
  • 请用代码解释一下。
  • 显示错误,嘿?您可以发布确切的消息并标记它失败的代码行。无论如何,你有一个工作运算符== 吗?对我来说似乎更简单地将连接传递给 map_data_compare 构造函数并将其存储,而不是绑定,但任何一种方式都可以......
  • yaa 它支持 == 运算符。并且错误是模板参数的数量错误(1,应该是 4)/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4 .6/bits/stl_ma‌​ph:86:错误:为'template class std::map 提供。我在这里编辑了代码。
  • 哪一行是 86?当您有相关信息时,我们不应该四处摸索......

标签: c++ templates map stl client-server


【解决方案1】:

我用 c++ 开发了一个程序,我必须在 stl map 中使用值找到键。

这不是地图的用途。如果您需要这种访问权限,我推荐Boost.Bimap

【讨论】:

  • 我无法使用 Boost.Bitmap
  • 然后只使用两张地图,一张从 A 到 B,一张从 B 到 A,并保持同步。
【解决方案2】:

如果“键”必须是唯一的,也许您可​​以尝试将键和值组合成std::pair,然后将它们推送到std::set

否则,您应该将您的键设置为值并将值设置为键,因为您似乎主要使用您的原始值作为我们对待“键”的值。然后你可以使用内置的map::find()函数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-08
    • 2015-04-17
    • 2014-08-19
    • 1970-01-01
    • 2019-07-23
    • 2018-01-23
    • 1970-01-01
    • 2021-10-17
    相关资源
    最近更新 更多