在类中使用C ++映射,如何创建成员访问器

时间:2010-10-05 03:13:24

标签: c++ map

我是地图的新手。我需要一个为表演构建座位的课程(有很多表演)。这是我到目前为止所做的:

// header stuff/libraries

Seats::Seats()
{
    map< const string, bool > seat;

    seat["A1"] = false;
    seat["A2"] = false;
    /* more seats .. */
}

如果我想更新座位,是否需要创建访问成员?如果可以,我可以举个例子吗?

3 个答案:

答案 0 :(得分:4)

正如其他人所指出的那样,你的map变量需要是该类的数据成员,而不是你发布的Seats构造函数的本地范围

class Seats {
public:
   Seats();
   bool GetSeat(const string &);
   void SetSeat(const string &, bool);

private:
   map< string, bool > seat;

};

Seats::Seats() {
    // merely your example values posted.
    seat["A1"] = false;
    seat["A2"] = false;
}

void Seats::SetSeat(const string &seat_number, bool occupied) {
    seat[seat_number] = occupied;   
}

bool Seats::GetSeat(const string &seat_number) {
    return seat[seat_number];
}

请记住使用map的[]运算符虽然可以导致元素插入数据结构(如果它们尚不存在): link text

  

T&安培; operator [](const key_type&amp; x);   如果x与任何键不匹配   容器中的元素,功能   使用该键插入新元素   并返回对其映射的引用   值。请注意,这始终是   将地图大小增加一,即使   没有为其分配映射值   元素(构造元素   使用其默认构造函数)。

答案 1 :(得分:0)

这可能会让你开始。

class Seats {
private: // private section: implementation details here
    set< string > reservations;

public: // public section: accessors here
    bool is_reserved( string const &id ) const {
        return reservations.count( id );
    }

    bool reserve( string const &id ) { // return false if res. already existed
        return reservations.insert( id ).second;
    }
};

答案 2 :(得分:0)

如果要将容器(如std::map)用作类中的数据成员,则需要在类定义中将其与该类的其余数据成员一起使用。

std :: map的一个curios(故意)属性是operator[]默认为那些尚未在集合中的键构造值,所以除非你真的需要得到一个列表({{1默认情况下),没有必要初始化它们。