使用c ++中的Set值映射

时间:2014-05-25 14:44:34

标签: c++ map set

当我尝试打印Map的值Set时,我遇到了问题。 我必须实现MapSet的所有功能(不使用map或设置库),但我确信它们的工作方式与它们相同。 printSet函数正在运行。

简要列举我的职能:

#define SType string
#define VType set

struct setNode {
  SType key;
  setNode* left;
  setNode* right;
  setNode* parent;
};

class set {
 public:
  set();
  bool empty();
  int size();
  setNode* begin();
  setNode* end();
  setNode* next(setNode* x);
  setNode* prev(setNode* x);
  SType key(setNode* x);
  setNode* find(SType k);
  void insert(SType k);
  void erase(SType k);
  void clear();
  void operator=(set& s);
  ~set();

 private:
  int size_;
  setNode* root_;
};

struct mapNode {
  SType key;
  VType value;
  mapNode* left;
  mapNode* right;
  mapNode* parent;
};

class map {
 public:
  map();
  bool empty();
  int size();
  mapNode* begin();
  mapNode* end();
  mapNode* next(mapNode* x);
  mapNode* prev(mapNode* x);
  VType& operator[](SType k);
  SType key(mapNode* x);
  VType value(mapNode* x);
  mapNode* find(SType k);
  void insert(SType k, VType v);
  void erase(SType k);
  void clear();
  void operator=(map& s);
  ~map();

 private:
  int size_;
  mapNode* root_;
};

现在打印功能:

void printSet(set& c) {

  for (setNode* i = c.begin(); i != c.end(); i = c.next(i)) {
    cout << c.key(i) << " ";
  }
}

void printMap(map& m){
    for (mapNode* i = m.begin(); i != m.end(); i = m.next(i)) {
    cout<<m.key(i)<<"\t";
    printSet(m.value(i));//error in this line
    cout<<endl;
  }
}

我收到invalid initialization of non-const reference of type 'set&' from an rvalue of type 'set'错误,但我无法弄清楚出了什么问题......

1 个答案:

答案 0 :(得分:0)

问题是value(mapNode* x)返回VType这是一个临时值。 另一方面,void printSet(set& c)通过参考得到一个变量。

这意味着您正在尝试存储和访问非法的临时值。

将您的打印功能更改为:

void printSet(const set& c) 
void printMap(const map& m)

而且你也不能在它的const变量中使用map类的const成员,所以你必须使begin end key成为下一个值const

class map {
 public:
  map();
  bool empty()const ;
  int size()const ;
  mapNode* begin()const;
  mapNode* end()const;
  mapNode* next(mapNode* x)const;
  mapNode* prev(mapNode* x)const;
  ...
 }