c++初学者:将索引语法转换为迭代器语法

Beginner C++: Transforming index-syntax into iterator-syntax

本文关键字:语法 转换 迭代器 索引 初学者 c++      更新时间:2023-10-16

我正在尝试学习具有一点Java背景的c++,并且我正在尝试编写返回两个列表交集的代码。我相信我在概念上有正确的想法,但我有语法问题,因为没有什么是编译。

下面是我想出来的代码:
#include <iostream>
using namespace std;
#include <list>
template <typename Object>
list<Object> intersection( const list<Object> & L1, const list<Object> & L2){
  std::list<Object> result;                 
  int pos1 = 0;
  int pos2 = 0;
  while (pos1 < L1.size() && pos2 < L2.size()) {
    if (L1[pos1] > L1[pos2]) {
      pos1++;
    } else if (L2[pos2] > L1[pos1]) {
      pos2++;
    } else {
      result.push_back(L2[pos2]);
      pos1++;
      pos2++;
    }
  }
  return result;
}
我认为我需要的东西:一个迭代器(我确定我访问列表的方式是不正确的)

将pos1和pos2改为迭代器:

list<Object> intersection( const list<Object> & L1, const list<Object> & L2){
  std::list<Object> result;                 
  std::list<Object>::iterator pos1 = L1.begin(), pos2 = L2.begin();
  while (pos1 != L1.end() && pos2 != L2.end()) {
     if (*pos1 > *pos2) { //works only if pos1 != L1.end() and pos2 != L2.end()
       pos1++;
       ...

pos1 = L1.begin()pos1指向L1的第一个元素。

++pos1将迭代器向前移动到下一个元素

*pos1pos1获取元素

pos1 != L1.end()检查pos1是否到达列表的末端。当pos1 == L1.end() .

时,不能从pos1中获取元素。

你需要一个const_iterator而不是iterator

所有的c++容器类都有typedef s来定义它们所包含的类型、迭代器类型等。

在您的例子中,list<Object>::value_type的类型是Object。所以你可以说:

list<Object>::value_type object = Object();

同样,list<Object>::iterator是遍历容器的迭代器类型。您可以使用begin()end()获得表示容器开始和结束的迭代器。

如果您的容器是const,如您的问题,begin和end不返回iterator,他们返回const_iterator。您不能将其分配给iterator类型。它们的不同之处在于一个允许你修改值,而另一个不允许。

你可以使用const_iterator来解决你的问题。但是,有许多其他方法可以解决这个问题。

  • auto意味着您不必明确指定类型。它为你做正确的事情。
  • 模板可以使用泛型参数,所以,同样,你不必明确。
  • 标准库有各种算法,可能已经做了你想要的(例如set_intersection)。