2013-12-17 4 views
-1
나는 다음과 같은 프로그램을 시도하고

를 사용하는 프로그램 : TQ 템플릿 종류 요소 std::pair<T,Q>를 포함하는 벡터에 대한 포인터를 갖는 템플릿 클래스 map. std::mapT은 '키'유형이고, Q은 '값'유형을 나타냅니다. 다음은 구현되어야합니다 :
1. 생성자 & 소멸자.
2. 기능 emptybool을 반환합니다 (개체가 비어있는 경우).
기능 size (count_if 사용)
4. 모든 벡터 레코드를 삭제하는 기능 clear.
5. 허용 운영자 [] : >>클래스 템플릿, 쌍, 벡터

나는 위의 작업을 코딩하는 노력했습니다 (equal 기능을 사용하여) map["PI_value"] = 3.14;이 기능을 find
6. 운영자 =, ==, !=을 사용해야 만했다 아래의 코드에 갇혀있다. 이 혼란을 해결할 아이디어가 있습니까?

#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}'을 (를) 삽입해야하는 이유입니다. '빈'이 잘못되었습니다. 'operator []'는'Q &'를 반환해야합니다 ... – Jarod42

답변

0

std::find_if에 제공된 람다가 잘못 선언되었습니다.

예를 들어 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()이라는 것을 기억해야합니다.