相关疑难解决方法(0)

C++ 11基于反向范围的for-loop

是否有一个容器适配器可以反转迭代器的方向,所以我可以反向迭代一个容器,基于范围的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)

有这样的事情还是我必须自己写?

c++ c++11 ranged-loops

309
推荐指数
8
解决办法
10万
查看次数

你可以在迭代它时从std :: list中删除元素吗?

我有代码看起来像这样:

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时,删除项目的最佳方法是什么?

c++ list std

233
推荐指数
7
解决办法
21万
查看次数

迭代器是向量的最后一个元素

我需要获取一个迭代器到a中的最后一个元素std::vector.

已知end()方法返回一个迭代器,引用向量容器中的past-the-end元素.我可以通过使用实现我需要的东西end() - 1吗?

据我所知,我不能使用back()方法,因为它返回一个引用.

c++ iterator vector

7
推荐指数
2
解决办法
2902
查看次数

我应该如何以相反的顺序循环遍历 C++ 容器的元素?

假设我是一个新手 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)

但是 - 我不喜欢循环计数器的意思与我们所看到的相反。但是,如果我开始ivec.size()-1,我将在最后一个元素之后的风险溢。所以我需要这样做,也许?

for(std::vector<int>::size_type i = vec.size(); i > …
Run Code Online (Sandbox Code Playgroud)

c++ iteration reverse containers idioms

4
推荐指数
1
解决办法
373
查看次数

通过 std::array 或 std::vector 向后迭代的正确方法是什么?

所以我这样做的基本想法是这种循环:

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 呢?

c++ loops

3
推荐指数
2
解决办法
150
查看次数

“错误定义的 for 循环 - 循环无限执行”(MSVC C6295)

我不太清楚为什么 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() 返回一个无符号整数,我无法控制它

c++ visual-studio

2
推荐指数
1
解决办法
4085
查看次数