Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用迭代器重写循环的一部分_C++_Iterator - Fatal编程技术网

C++ 用迭代器重写循环的一部分

C++ 用迭代器重写循环的一部分,c++,iterator,C++,Iterator,我试图掌握迭代器的诀窍,我会发布失败的尝试,但我看不出有什么意义,所以我只发布我试图用迭代器重写的代码 如何让类使用向量的迭代器来跟踪位置,而不是生成自己的临时迭代器 具体地说,我试图跟踪在固定循环中已经打印的字母 实时代码 代码预览 #包括 #包括 ABC班 { 受保护的: std::载体ABCs; int-currentLetter; 公众: ABC():当前字母(0){} 无效添加字母(字符字母) { ABCs.推回(字母); } 字符getLetter(int位置) { 返回ABCs.

我试图掌握迭代器的诀窍,我会发布失败的尝试,但我看不出有什么意义,所以我只发布我试图用迭代器重写的代码

如何让类使用向量的迭代器来跟踪位置,而不是生成自己的临时迭代器

具体地说,我试图跟踪在固定循环中已经打印的字母

实时代码

代码预览
#包括
#包括
ABC班
{
受保护的:
std::载体ABCs;
int-currentLetter;
公众:
ABC():当前字母(0){}
无效添加字母(字符字母)
{
ABCs.推回(字母);
}
字符getLetter(int位置)
{
返回ABCs.at(位置);
}
int getLetterPosition()
{
回信;
}
void setLetterPosition(int newPosition)
{
currentLetter=新位置;
}
};
无效打印句子(ABC*字母表,整数限制)
{
对于(int i=0;igetLetter(alphabet->getLetterPosition()),alphabet->getLetterPosition(alphabet->getLetterPosition()+1));
字母表->设置字母位置(字母表->获取字母位置()+2);
}
}
int main()
{
ABC字母表;
ABC*字母指针=&alphabet;
for(字符字母='a';字母<'z';字母++)
{
字母表。添加字母(字母);
}
printf(“%s\n”,“参数为四个字母的printSession()”);
打印句子(字母指针,4);
//再次
printf(“%s\n”,“参数为六个字母的printSession()”);
打印句子(字母指针,6);
返回0;
}

您可以将常量迭代器类型定义为您自己的向量,如下所示:

class ABC
{
public:
   typedef std::vector<char> CharCollection;
   typedef typename CharCollection::const_iterator const_iterator;

protected:
   CharCollection ABCs;
   int currentLetter;
   ...
public:
    const_iterator begin()  const {return ABCs.begin();}
    const_iterator end()    const {return ABCs.end();  }
    const_iterator cbegin() const {return ABCs.begin();}
    const_iterator cend()   const {return ABCs.end();  }
ABC abc;
...
for (ABC::const_iterator it=abc.begin();it!=abc.end();++it)
   {
   char c = *it;
   ...
   }
class ABC
{
public:
   typedef std::vector<char> CharCollection;
   const CharCollection &getABCs() const {return ABCs;}

注意,我还实现了新的C++ cScand和cEnter方法。 在这里使用常量迭代器很重要。您不希望来电者在背后更改您的收藏

现在您可以像这样在其上循环:

class ABC
{
public:
   typedef std::vector<char> CharCollection;
   typedef typename CharCollection::const_iterator const_iterator;

protected:
   CharCollection ABCs;
   int currentLetter;
   ...
public:
    const_iterator begin()  const {return ABCs.begin();}
    const_iterator end()    const {return ABCs.end();  }
    const_iterator cbegin() const {return ABCs.begin();}
    const_iterator cend()   const {return ABCs.end();  }
ABC abc;
...
for (ABC::const_iterator it=abc.begin();it!=abc.end();++it)
   {
   char c = *it;
   ...
   }
class ABC
{
public:
   typedef std::vector<char> CharCollection;
   const CharCollection &getABCs() const {return ABCs;}
您也可以在此处使用
auto
,而不是
ABC::const\u迭代器

这里有一些陷阱:

  • 如果ABC类中的向量被扩展,那么指向may的迭代器将变得无效。因此,您应该清楚地记录您的类的用户在迭代向量时不能调用任何扩展向量的方法
  • 只能有一个开始和一个结束方法。因此,如果您向ABC类添加更多向量,您必须编写像beginABC、beginXYZ等方法。。。最后也是一样
因此,我通常不希望这样写,而是将向量作为一个整体公开给类的用户,如下所示:

class ABC
{
public:
   typedef std::vector<char> CharCollection;
   typedef typename CharCollection::const_iterator const_iterator;

protected:
   CharCollection ABCs;
   int currentLetter;
   ...
public:
    const_iterator begin()  const {return ABCs.begin();}
    const_iterator end()    const {return ABCs.end();  }
    const_iterator cbegin() const {return ABCs.begin();}
    const_iterator cend()   const {return ABCs.end();  }
ABC abc;
...
for (ABC::const_iterator it=abc.begin();it!=abc.end();++it)
   {
   char c = *it;
   ...
   }
class ABC
{
public:
   typedef std::vector<char> CharCollection;
   const CharCollection &getABCs() const {return ABCs;}
ABC类
{
公众:
typedef std::向量字符集合;
const CharCollection&getABCs()const{return ABCs;}
这样,调用者就可以更清楚地看到,他可以获取集合,但他不能更改它(它是const),并且如果ABC类中发生更改,它将变得无效(因为它返回一个引用)

现在,调用方可以选择对集合执行任何操作:

  • 使用CharCollection::begin()和end()对其进行迭代
  • 如果在循环过程中需要更改ABC类实例,请复制它
  • 或者使用任何其他可以处理集合的STL方法

为了澄清:您想迭代一个
ABC
对象,比如
vector
对象?@很快,我就不用使用我的临时
alphabet->getLetterPosition()
等函数来跟踪已打印的字母,而是使用类似
std::vector::iterator
的函数。