您好我从以下代码收到编译错误。我无法弄明白:
g++ stl_list_1.cc
stl_list_1.cc: In function \u2018int main()\u2019:
stl_list_1.cc:16: error: \u2018struct std::_List_iterator<int>\u2019 has no member named \u2018clist\u2019
stl_list_1.cc:19: error: \u2018struct std::_List_iterator<int>\u2019 has no member named \u2018clist\u2019
stl_list_1.cc:25: error: no match for call to \u2018(std::list<std::_List_const_iterator<int>, std::allocator<std::_List_const_iterator<int> > >) (int&)\u2019
代码:
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
main()
{
std::list<int> clist;
for (int i =0; i<10; i++)
{
clist.push_back(i);
}
std::list<std::list<int>::const_iterator> list1;
std::list<int>::iterator itr1;
itr1 = std::find(clist.begin().clist.end(),1);
std::list<int>::iterator itr2 ;
itr2 = std::find(clist.begin().clist.end(),7);
list1.push_back(itr1);
list1.push_back(itr2);
for(int j =0; j< list1.size(); j++)
{
int k = *list1[j];
std::cout << "cvalue " << k <<std::endl;
j++;
}
}
由于 Ruchi
答案 0 :(得分:3)
这是一个错字,你使用点而不是逗号:
itr1 = std::find(clist.begin().clist.end(),1);
^
应该是这样的:
itr1 = std::find(clist.begin(), clist.end(),1);
你在std::find
的两个电话中都犯了这个错误。
此外,您尝试在列表中使用operator[]
,这将无效。而不是:
int k = *list1[j];
您可以使用:
itr1 = list1.begin();
std::advance(itr1, j);
int k = *itr1;
正如JohnB所说,上面的代码是低效的。隔离,它是一样的,但是因为你在循环中使用它,所以最好只使用列表迭代器来执行迭代:
for(itr1 = list1.begin(); itr1 != list1.end(); ++itr1)
{
int k = *itr1;
std::cout << "cvalue " << k <<std::endl;
}
答案 1 :(得分:0)
另外,请记住
list1[j]
不起作用,因为列表没有索引运算符,因此您必须迭代它。
建议:使用std::vector< int >
代替std::list< int >
。
答案 2 :(得分:0)
正如其他人已经注意到find
来电中有一个拼写错误(.
而不是,
)。
但是,一旦你过了list
没有[]
运算符,你就会发现那部分也不正常。您需要使用迭代器在最终循环中遍历列表。
答案 3 :(得分:0)
int k = *list1[j];
那也不会编译。
也许这样的事情可能(不检查任何安全等,它是一种废话,但只是显示)
int k = *(find(clist.begin(), clist.end(), j));
你也两次增加j,你是说这个吗?
for(int j =0; j< list1.size(); j++) //here
{
int k = *list1[j];
std::cout << "cvalue " << k <<std::endl;
j++; //and here?
}