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

时间:2013-03-04 07:48:34

标签: c++ list iterator intersection

我试图用一点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;

}

我认为我需要的东西: 迭代器(我确定我访问列表的方式不正确)

2 个答案:

答案 0 :(得分:5)

将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时,您无法从pos1 == L1.end()获取元素。

答案 1 :(得分:2)

您需要const_iterator而不是iterator

所有c ++容器类have typedefs on them定义了它们包含的类型,以及迭代器类型等等。

在您的情况下,list<Object>::value_type的类型为Object。所以你可以说:

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

类似地list<Object>::iterator是用于遍历容器的迭代器的类型。您可以使用begin()end()来获取表示容器开头和结尾的迭代器。

如果您的容器const与您的问题begin一样,iterator并且不会返回const_iterator,则会返回iterator。您无法将其分配给const_iterator类型。它们是不同的,因为一个允许你修改值,另一个不允许。

您可以使用auto解决问题。但是,还有其他一些方法可以解决这个问题。

  • {{1}}表示您不必明确该类型。它为你做对了。
  • 模板可以使用通用参数,因此,您也不必明确。
  • 标准库有各种算法,可能已经做了你想做的事情(例如set_intersection)。