是否有一个容器适配器可以反转迭代器的方向,所以我可以反向迭代一个容器,基于范围的for循环?
使用显式迭代器,我会将其转换为:
for (auto i = c.begin(); i != c.end(); ++i) { ...
Run Code Online (Sandbox Code Playgroud)
进入这个:
for (auto i = c.rbegin(); i != c.rend(); ++i) { ...
Run Code Online (Sandbox Code Playgroud)
我想转换这个:
for (auto& i: c) { ...
Run Code Online (Sandbox Code Playgroud)
对此:
for (auto& i: std::magic_reverse_adapter(c)) { ...
Run Code Online (Sandbox Code Playgroud)
有这样的事情还是我必须自己写?
我有代码看起来像这样:
for (std::list<item*>::iterator i=items.begin();i!=items.end();i++)
{
bool isActive = (*i)->update();
//if (!isActive)
// items.remove(*i);
//else
other_code_involving(*i);
}
items.remove_if(CheckItemNotActive);
Run Code Online (Sandbox Code Playgroud)
我想在更新后立即删除非活动项目,以避免再次走过列表.但是如果我添加注释掉的行,当我到达时会出现错误i++:"List iterator not incrementable".我尝试了一些替代品,它们没有在for语句中增加,但我无法得到任何工作.
当你走std :: list时,删除项目的最佳方法是什么?
我需要获取一个迭代器到a中的最后一个元素std::vector.
已知end()方法返回一个迭代器,引用向量容器中的past-the-end元素.我可以通过使用实现我需要的东西end() - 1吗?
据我所知,我不能使用back()方法,因为它返回一个引用.
假设我是一个新手 C++ 程序员。我有一个 C++ 容器;比如说,一个向量:
std::vector<int> vec { 12, 34, 56, 78 };
Run Code Online (Sandbox Code Playgroud)
我知道我可以用一个简单的循环遍历所有元素:
for(std::vector<int>::size_type i = 0; i < vec.size(); i++) {
std::cout << vec[i] << '\n';
}
Run Code Online (Sandbox Code Playgroud)
也许我什至对现代 C++ 有了一些了解,所以我知道我可以使用 ranged-for 循环:
for(auto x : vec) {
std::cout << x << '\n';
}
Run Code Online (Sandbox Code Playgroud)
但是现在,我想以相反的顺序迭代元素。基于范围的 for 循环不会这样工作。对于普通循环,我必须小心并避免下溢,所以也许是这样的?:
for(std::vector<int>::size_type i = 0; i < vec.size(); i++) {
std::cout << vec[vec.size() - i] << '\n';
}
Run Code Online (Sandbox Code Playgroud)
但是 - 我不喜欢循环计数器的意思与我们所看到的相反。但是,如果我开始i在vec.size()-1,我将在最后一个元素之后的风险溢。所以我需要这样做,也许?
for(std::vector<int>::size_type i = vec.size(); i > …Run Code Online (Sandbox Code Playgroud) 所以我这样做的基本想法是这种循环:
std::array<int,10> t{};
for (int k = t.size()-1; k >= 0; k--)
cout << t[k] << " ";
Run Code Online (Sandbox Code Playgroud)
问题是 .size() 方法返回一个 std::array::size_type,从我读过的内容来看,它可能比 int 大。
问题是 size_type 是无符号的,所以当我这样做时:
for (auto k = t.size()-1; k >= 0; k--)
cout << t[k] << " ";
Run Code Online (Sandbox Code Playgroud)
它只是无限循环,因为 k 不能为负。那么你将如何使用 size_type 变量迭代 std::array 或 std::vector backwars 呢?
我不太清楚为什么 Visual Studio 会给我以下代码的错误消息“错误定义的 for 循环:'unsigned int' 值始终在 '0' 到 '4294967295' 范围内。循环无限执行”:
for (unsigned int i = list->GetCount() - 1; i >= 0; i--)
{
// do stuff to each item (specifically in reverse order)
}
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释一下吗?
编辑: GetCount() 返回一个无符号整数,我无法控制它