2011-08-30 12 views
2

벡터를 사용하여 클래스의 멤버에 액세스

로 정의 된 클래스
typedef std::string Name; 
typedef int Age; 
typedef std::string Level; 

class Employee 
{ 
public: 
    // Employee (arguments); 
    // virtual ~Employee(); 
    void name(Name const & name) { name_ = name; } 
    Name name() const { return name_; } 

    void age(Age const & age) { age_ = age; } 
    Age age() const { return age_; } 

    void level(Level const & level) { level_ = level; } 
    Level level() const { return level_; } 

private: 
    Name name_; 
    Age age_; 
    Level level_; 
}; 

std::vector<Employee> read_file(std::string filename); 

std::vector<Employee> employees = read_file("data.txt"); 
std::cout << employees.size() << std:: endl; 

for(std::vector<Employee>::iterator it = employees.begin(); it != employees.end(); ++it) 
{ 
    std::cout << *it << std::endl; 
} 

위에 정의 된이 벡터를 사용하여 클래스 직원의 멤버에 액세스 할 수있는 방법이 있습니까? 나는 직원의 키 값으로 map 컨테이너를 만들고 싶다.

답변

2

내가 질문을 잘못 해석하고있어하지 않는 한,이 정도로 간단하다.

  • itEmployee의 벡터에 대한 반복자입니다. it->name()

그래서, 당신은 Employee에 직원 수준의지도를 구축하려는 경우, 당신이 :

  • *itEmployee
  • it->Employee
    • 등의 액세스 권한 회원 수있다 이를 수행 할 수 있습니다 :

      std::map<Level, Employee> employeeMap; 
      for(std::vector<Employee>::iterator it = employees.begin(); 
          it != employees.end(); 
          ++it) 
      { 
          employeeMap[ it->level() ] = *it; 
      } 
      

      직원의 LevelEmployee

  • +0

    감사합니다 :) 나는 그것을 찾고 있었다 ->' – vivekv80

    2
    const Name name = it->name(); 
    const Age age  = it->age(); 
    const Level level = it->level(); 
    

    또는

    const Name name = employees[i].name(); 
    const Age age  = employees[i].age(); 
    const Level level = employees[i].level(); 
    

    는 잘 작동합니다.

    그러나 일반적으로 개체의 복사본을 만드는 것보다 훨씬 빠르기 때문에 위의 각 항목을 참조로 반환하는 것이 좋습니다. 다음과 같이

    class Employee 
    { 
    public: 
        // Employee (arguments); 
        // virtual ~Employee(); 
        void name(Name const & name) { name_ = name; } 
        Name& name() { return name_; } 
        const Name& name() const { return name_; } 
    
        void age(Age const & age) { age_ = age; } 
        Age& age() { return age_; } 
        const Age& age() const { return age_; } 
    
        void level(Level const & level) { level_ = level; } 
        Level& level() { return level_; } 
        const Level& level() const { return level_; } 
    private: 
        Name name_; 
        Age age_; 
        Level level_; 
    }; 
    

    그런 다음 참조로 값을 액세스 할 수 있습니다

    즉 :

    it->name() = "Goz"; 
    it->age() = 33; 
    it->level() = "Programmer"; 
    
    +0

    으로 매핑하는 직원 맵이 있습니다. const 멤버의 참조를 반환하지 않는 것이 좋습니다. 비 const 버전에서 참조를 반환하고 const 함수에서 const 참조를 반환합니다. –

    +0

    그리고 const가 아닌 멤버에서 참조를 반환하는 경우 해당 객체도 공개 될 수 있습니다. 그것이 사적인 것이라면, 당신은 그것을 원하지 않을 것입니다. 그냥 const 참조 버전을해라. –

    +0

    const 메서드에서 참조를 반환하려면'const' 참조를 반환하는 것이 좋습니다. – Tim

    4

    당신 경우 :

    const Name& name = it->name(); 
    const Age& age  = it->age(); 
    const Level& level = it->level(); 
    

    을 또한이 같은 값을 변경할 수 있음을 의미 iterator에서 Employee의 멤버에 액세스하려면 멤버 액세스 연산자를 사용할 수 있습니다.:

    the_map[it->level()] = blah; 
    
    관련 문제