如何将迭代器放入 std::list 的第 n 个元素<class>?



我有一个自定义类MyData

class MyData
{
private:
int data;
public:
int getData() const
{
return data;
}
MyData(int val)
: data(val)
{
cout << "Constructor invoked" << endl;
}
MyData(const MyData& other)
{
cout << "Copy constructor invoked" << endl;
data = other.data;
}
MyData& operator =(const MyData& other)
{
cout << "Assignment operator invoked" << endl;
data = other.data;
return *this;
}
friend ostream& operator<<(ostream& os, const MyData& d)
{
cout << "<< operator overloaded" << endl;
os << d.data;
return os;
}
};

main函数中,我有

list<MyData> data2{ 12,21,32,113,13,131,31 };

我想让我的迭代器到第4个元素,让我们直接说而不是每次都做一个递增的++操作。

我该怎么做?

list<MyData>::iterator it = data2.begin();
it += 4; // error since I cannot increment this???-compile time error.

我是这样做的-

it++; it++; it++; it++; 

如何使迭代器直接指向第4元素?

我尝试使用先进的std::advance(data2.begin(),3);。但是,这会抛出一个错误,说

error: cannot bind non-const lvalue reference of type ‘std::_List_iterator<MyData>&’ to an rvalue of type ‘std::__cxx11::list<MyData>::iterator’ {aka ‘std::_List_iterator<MyData>’}
data1.splice(it, data2,advance(data2.begin(),3),data2.end()); //splice transfer range.

基本上,我这样做是为了从另一个具有一个元素或一些时间范围的列表中拼接列表。

查看错误信息的简化版本

cannot bind non-const lvalue reference of type [...]
to an rvalue of type [...]

意思是,您试图将临时r值(即data2.begin())绑定到非常量迭代器引用。这在c++标准中是不可能的。因此,编译器错误。

当你看std::advance签名

template< class InputIt, class Distance >
constexpr void advance(InputIt& it, Distance n); (since C++17)
//                     ^^^^^^^^^^^^

期望为l值输入迭代器类型

因此,您需要
auto iter = data2.begin(); // l-value input iterator
std::advance(iter, 3);

指出:

  • 需要更多了解c++的值类;请参阅此处类别。
  • it+=4;it++;等操作只对随机可行访问迭代器(参见表达式)链接中的S)。但是,std::list已经只有双向的迭代器,

Try

auto it = data2.begin();
std::advance(it, 3);

你试图修改begin()本身,这就是为什么你得到一个错误。

您想要std::next而不是std::advance。后者将修改传入的迭代器。前者将返回一个新值。

auto it = std::next(data2.begin(), 3);

最新更新