2013-12-17 67 views
-1

我試圖設定以下的程序: 具有指向包含元素std::pair<T,Q>,其中TQ是模板類型的載體模板類map。它的工作原理與std::map類似,T是'key'類型,而Q代表'value'類型。除此之外還應執行:
1.構造函數&析構函數。
2.功能empty返回bool(如果對象爲空)。
3.功能size(使用count_if
4.功能clear刪除所有向量記錄。
5.操作[]它允許:map["PI_value"] = 3.14;應該使用功能find
6.運營商===!=>>(使用equal功能)使用類模板,一對,矢量

我一直在試圖代碼上面的任務,但卡在下面的代碼。 你有任何想法來修復這個爛攤子嗎?

#include <iostream> 
#include <tuple> 
#include <utility> 
#include <algorithm> 
#include <vector> 


using namespace std; 

template <typename T, typename Q> 
class mapa 
{ 
private: 
    vector<std::pair<T,Q>>* ptr; 
    public: 
    /**< DEFAULT CONSTRUCTOR/////////////////////////// */ 
    mapa() 
    { 
     ptr = new vector<std::pair<T,Q>>; 
     ptr->push_back(std::pair<T,Q>(0,0)); 
    } 
    /**< DESTRUCTOR////////////////////////////////////// */ 
    ~mapa(){ delete ptr;} 
    /**< EMPTY()////////////////////////////// */ 
    bool empty() 
    { 
     if(ptr) 
      return false; 
     else 
      return true; 
    } 
    /**< SIZE()///////////////////////////////// */ 
    int size() 
    { 
     return ptr->size(); 
    } 
    /**< CLEAR()///////////////////////////////// */ 
    void clear() 
    { 
     ptr->clear(ptr->begin(), ptr->end()); 
    } 
    /**< OPERATOR[]/////////////////////////////////////////// */ 
    vector<std::pair<T,Q>>* & operator[](T key) 
     { 
     auto ptr2 = ptr; 
     if(empty()) 
     { 
      std::pair<T,Q> para; 

      para.first = key; 
      para.second = 0; 
      ptr2->push_back(para); 
      //ptr2->push_back(std::pair<T,Q>(key,0)); 
     } 
     else 
     { 

      auto ptr2 = find_if(ptr->begin(), ptr->end(), 
      [](std::pair<T,Q> example,T key) 
          { 
           return(example.first==key); 
          } 
          ); 
     } 
     return ptr2; 
    } 
}; //class end 
+1

你的'empty()'函數總是返回'true',除非該向量的內存分配失敗。 –

+2

而這導致另一件事:爲什麼使用矢量指針? –

+0

爲什麼'ptr'是一個指針,爲什麼在構造函數中插入'{0,0}','empty'是錯誤的。 'operator []'應該返回'Q&' – Jarod42

回答

0

提供給std::find_if的lambda被聲明爲錯誤。

如果您看到例如this reference for std::find_if,你會看到的功能應該像

bool pred(const Type &a) 

這意味着拉姆達應該像

[&key](const std:pair<T, Q>& element) { return element.first == key } 

還有其他問題,您operator[]功能,如它應返回Q&而不是對矢量指針的引用。您還應該記住std::find_if會將找到的元素返回一個迭代器,如果找不到則返回end()