【问题标题】:Retrieving the first element in c++ vector检索 C++ 向量中的第一个元素
【发布时间】:2012-09-29 13:15:40
【问题描述】:

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

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 >}”转换为“Atom*”

【问题讨论】:

  • 迭代器可以是并且很可能不是指针类型。

标签: c++ vector iterator std


【解决方案1】:
  Atom* first = atoms.begin(); // <== type error

这会将first 设置为一个迭代器。您想将其设置为等于迭代器指向的对象。试试:

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

或:

  Atom* first = atoms.front();

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

【讨论】:

    【解决方案2】:

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

    您要查找的方法很可能是std::vector::front()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 1970-01-01
      • 2019-05-10
      • 2020-08-22
      相关资源
      最近更新 更多