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(我敢肯定,我在访问列表的方式是不正确的)
变化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
到达列表结束。当pos1 == L1.end()
时,您不能从pos1
获取元素。
非常感谢你,这正是我所需要的。 – 2013-03-04 08:03:35
迭代器需要是'const'。 – 2013-03-04 09:16:39
您需要一个const_iterator
而不是iterator
。
所有C++容器类have typedef
s 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
表示您不必明确说明类型。它为你做了正确的事情。 - 模板可以使用泛型参数,因此,您不必显式。
- 标准库有各种算法可能已经做到了你想要的(例如
set_intersection
)。
我修改了标题以使其具有更好的描述性,并指出这是一个相对普遍的问题,对于未来的用户很有意思。我希望这是好的(如果不是,请回复)。 – jogojapan 2013-03-04 08:16:51
既然你是C++的初学者,可能值得一提的是你不应该真的使用'std :: list' ......永远。 (不是因为C++类有什么问题,而是因为它是一个可怕的数据结构)。当你只需要一个容器时,默认为'vector'而不是。 (这也可以让你的代码使用索引而不是迭代器) –
jalf
2013-03-04 08:21:02
好点。 'vector'在大多数情况下都更好,但我认为知道'list'和'vectors'的优点和缺点是很好的,如果你想在某些时候编写好的C++代码,你需要知道指针/迭代器。 – Ari 2013-03-04 08:29:37