5

我正在尝试使用一点 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;

}

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

4

2 回答 2

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将迭代器向前移动到下一个元素

*pos1从中获取元素pos1

pos1 != L1.end()检查是否pos1到达列表的末尾。你不能从pos1when中获取元素pos1 == L1.end()

于 2013-03-04T07:55:05.877 回答
2

你需要一个const_iteratornot iterator

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

在你的情况下list<Object>::value_type是 type Object。所以你可以说:

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

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

如果您的容器const与您的问题一样,begin并且 end 不要 returniterator他们 return const_iterator。您不能将其分配给iterator类型。它们是不同的,因为一个允许您修改值,另一个不允许。

您可以使用const_iterator. 但是,还有许多其他方法可以解决此问题。

  • auto意味着您不必明确说明类型。它为您做正确的事。
  • 模板可以使用泛型参数,因此,您不必明确说明。
  • 标准库有各种可能已经做你想做的算法(例如set_intersection)。
于 2013-03-04T09:15:44.140 回答