簡體   English   中英

map <key,pair<a,b> &gt; 至 map <key,a></key,a></key,pair<a,b>

[英]map<Key,pair<A,B>> to map<Key,A>

我有一個 class 出於某種原因需要為每個鍵存儲一對(比如 int,double),但其接口只公開這對(int)的兩個值之一。 一種實現可能是

using namespace std;
class Foo {
public:
  map<string,int> const & get() const {return external;}
  void doStuff(string const & str) {
    external.at(str);
    internal.at(str);
  }
private:
  map<string,int> external;
  map<string,double> internal;
};

缺點是 doStuff 有雙重查找。

另一種方法是存儲map<string,pair<int,double>> allin但是返回整個 map 的訪問器需要一個副本。

當然,最后一種方法是通過使用return allin.at(key).first;訪問單個鍵來使訪問器更具原子性。 ,這似乎是最好的方法,但它破壞了我想提供的界面。

我想知道,有沒有辦法避免“外部/內部”版本中的雙重查找?

另一種方法是定義具有私有和公共值的 map 條目。 通過朋友聲明,私有值可以對 Foo class 可見。

#include <iostream>
#include <string>
#include <map>

class Foo;
template<typename T1, typename T2>
struct my_map_entry
{
    public:
        my_map_entry()=default;
        my_map_entry(T1 v, T2 pv)
        {
            value = v;
            private_value = pv;
        }
        T1 value;
    private:
        T2 private_value;
        friend class Foo;
};

class Foo {
    public:
        Foo(){
            map["test"]=my_map_entry<int, double>(1, 2.0);
        }
    
        void doStuff(const std::string& str
        {
            auto entry = map.at(str);
            std::cout<<"private_value: "<<entry.private_value<<std::endl;
        }
    
        std::map<std::string,my_map_entry<int, double>> map;
};

int main()
{
    Foo test;
    test.doStuff("test");
}

鑒於您只希望用戶能夠檢索項目,您的 get() 方法可以在考慮到該要求的情況下重寫。

using namespace std;
class Foo {
public:
  int *const get(string const &str) const {
    auto it = map_.find(str)
    return it == map_.end() ? nullptr : &it->first;
  }

  void doStuff(string const & str) {
    map_.at(str);
  }
private:
  map<string,pair<int, double>> map_;
};

這個想法是如果沒有找到鍵,則返回 nullptr,如果找到鍵,則返回指向值的指針。

相反,如果您還希望能夠枚舉所有可用的整數,那么您只有三個選擇:

  1. 使您的 Foo class 成為類似地圖的 class,並使用自己的迭代器來包裝內部 map 的迭代器。
  2. 使用其中一個可用的庫來提供幫助您實現先前目標的視圖(例如boost::transform_iterator
  3. 正如另一個答案所暗示的那樣,使用結構作為映射的值,並將其中一個字段設為私有,可能還有一個到 int 的轉換運算符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM