检索c ++向量中的第一个元素

时间:2012-09-29 13:15:40

标签: c++ vector iterator std

我编写了一个包装类来对类型向量执行插入/删除操作。 代码:

class GenericSymbolTable {
   public:
       virtual void pushBackAtom(Atom *atom) = 0;
       virtual Atom* peekAtom(void) = 0;
       virtual Atom* getAtom(void) = 0;

   protected:
      ~GenericSymbolTable(void){}
};

class SymbolTable : public GenericSymbolTable {
   private:
       vector<Atom*> atoms;

   protected:
       ~SymbolTable(void);

   public:
       void pushBackAtom(Atom *atom);
       Atom* peekAtom(void);
       Atom* getAtom(void);
};

编写这些方法的实现时,编译器会抛出冲突的类型错误:

   Atom* SymbolTable::peekAtom(void) {
      if(atoms.empty()) {
          cout << "\t[W] Simbol table does not contain any atoms" << endl;
          return NULL;
      }

      Atom* first = atoms.begin(); // <== type error
      return first;
   }

   Atom* SymbolTable::getAtom(void) {
      if(atoms.empty()) {
          cout << "\t[W] Simbol table does not contain any atoms" << endl;
          return NULL;
      }

      Atom* first = atoms.begin(); // <== type error
      atoms.erase(atoms.begin());
      return first;
   }

错误消息: 在初始化中无法将'std :: vector :: iterator {aka __gnu_cxx :: __ normal_iterator&gt;}'转换为'Atom *'

2 个答案:

答案 0 :(得分:6)

  Atom* first = atoms.begin(); // <== type error

这将first设置为等于迭代器。您希望将其设置为等于迭代器指向的对象。尝试:

  Atom* first = *(atoms.begin());

或:

  Atom* first = atoms.front();

由于这是Atom*的向量,因此其迭代器指向Atom* s。

答案 1 :(得分:3)

std::vector::begin不返回向量的第一个元素,它返回一个迭代器(指向第一个元素),可用于迭代向量。

您正在寻找的方法很可能是std::vector::front()