2013-12-17 70 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()