Beginner C++:将索引语法转换为迭代器语法

问题描述:

我想学习一点Java背景的C++,并试图编写返回两个列表交集的代码。我相信我在概念上有正确的想法,但由于没有任何内容正在编译,因此遇到了语法问题。Beginner 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; 

} 

事情我想我需要: 一个iterator(我敢肯定,我在访问列表的方式是不正确的)

+1

我修改了标题以使其具有更好的描述性,并指出这是一个相对普遍的问题,对于未来的用户很有意思。我希望这是好的(如果不是,请回复)。 – jogojapan 2013-03-04 08:16:51

+1

既然你是C++的初学者,可能值得一提的是你不应该真的使用'std :: list' ......永远。 (不是因为C++类有什么问题,而是因为它是一个可怕的数据结构)。当你只需要一个容器时,默认为'vector '而不是。 (这也可以让你的代码使用索引而不是迭代器) – jalf 2013-03-04 08:21:02

+0

好点。 'vector'在大多数情况下都更好,但我认为知道'list'和'vectors'的优点和缺点是很好的,如果你想在某些时候编写好的C++代码,你需要知道指针/迭代器。 – Ari 2013-03-04 08:29:37

变化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获取元素。

+0

非常感谢你,这正是我所需要的。 – 2013-03-04 08:03:35

+1

迭代器需要是'const'。 – 2013-03-04 09:16:39

您需要一个const_iterator而不是iterator

所有C++容器类have typedefs on them都定义了它们包含的类型,迭代器类型以及其他内容。

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

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

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

如果您的容器为const与您的问题begin和结束不返回iterator他们返回const_iterator。您不能将此分配给iterator类型。它们是不同的,因为一个允许你修改该值,另一个不允许。

您可以通过使用const_iterator来解决您的问题。但是,还有其他一些解决方法。

  • auto表示您不必明确说明类型。它为你做了正确的事情。
  • 模板可以使用泛型参数,因此,您不必显式。
  • 标准库有各种算法可能已经做到了你想要的(例如set_intersection)。