我试图用一点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;
}
我认为我需要的东西: 迭代器(我确定我访问列表的方式不正确)
答案 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
将迭代器向前移动到下一个元素
*pos1
从pos1
pos1 != L1.end()
检查pos1
是否到达列表的末尾。 pos1
时,您无法从pos1 == L1.end()
获取元素。
答案 1 :(得分:2)
您需要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
)。