2014-10-08 60 views
-5

有什麼方法可以使用STL在C++中搜索項目或屬性或變量。
我們可以使用STL提供的任何容器Searching time as less as possible。容器包含pair<int,int>。我想搜索一對p(a,x)哪個應該返回所有對的X,其p.first == Xi.first and p.second != Xi.second for all i
例如
讓容器是unordered_set。在C++中使用STL搜索變量/項目/屬性?

unordered_set< pair<int , int > > myset = 
    {{1,2},{1,5},{1,6},{2,4},{3,5},{4,6},{6,7},{6,8}}; 
    if i search for p(1,5) then it should return pair(1,2),(1,6) 
    if i search for p(2,4) or (3,5),(6,7) then it should return NULL i.e. nothing 
    if i search for p(6,7) then it should return pair(6,8) 
+2

以'multimap'或'unordered_multimap';使用'equal_range'來找到給定鍵的範圍,然後遍歷該範圍。 – 2014-10-08 08:20:07

回答

0

沿東西線的

std::vector<std::pair<int, int>> 
    find_nonmatching_values(const std::unordered_multimap<int, int> & thing, 
          int key, int value) { 
    std::vector<std::pair<int, int>> ret; 
    auto range = thing.equal_range(key); 
    std::copy_if(range.first, range.second, std::back_inserter(ret), 
       [value](const std::pair<const int, int> &p) 
       { return p.second != value; }); 
    return ret; 
} 

Demo。對代碼進行模板化是留給讀者的一個練習。

0

略多於T.C.s版本更普遍的:

#include <type_traits> 
#include <iterator> 

template <typename T, typename InputIterator, typename OutputIterator, typename Comparator> 
void find_mismatches(InputIterator first, InputIterator last, 
        T const& val, OutputIterator out, Comparator comp) 
{ 
    for (; first != last; ++first) 
    { 
     auto&& f = *first; 
     if (!comp(f.second, val)) 
      *out++ = f; 
    } 
} 

template <typename AssociativeCont, typename OutputIterator, typename Comparator> 
void find_mismatches(AssociativeCont&& rng, typename std::remove_reference<AssociativeCont>::type::value_type const& val, OutputIterator out, Comparator comp) 
{ 
    auto range = rng.equal_range(val.first); 
    find_mismatches(range.first, range.second, val.second, out, comp); 
} 

template <typename AssociativeCont, typename OutputIterator> 
void find_mismatches(AssociativeCont&& rng, typename std::remove_reference<AssociativeCont>::type::value_type const& val, OutputIterator out) 
{ 
    auto range = rng.equal_range(val.first); 
    find_mismatches(range.first, range.second, val.second, out, std::equal_to<decltype(val.second)>()); 
} 

Demo。請注意,您仍然可以通過使用作爲value_type的成員的指向成員的模板參數來擴展此項。