使用 size_t 值反向遍历矢量
Traversing a vector in reverse direction with size_t values
我想以相反的方向遍历向量的值。如您所知,向量的大小是size_t。当我使用以下代码时:
for(size_t r=m.size()-1; r >= 0; r--)
{
x[r] = f[r];
for(size_t c = r+1; c < m.size(); c++)
{
x[r] -= m[r][c] * x[c];
}
}
我将超出向量的范围,因为在递减 r = 0 后 r 将变得4294967295。
我没有更改 r 的类型,因为在我的项目中,我将警告视为错误,所以它应该是size_t的,或者我应该投射它,这并不有趣。
如果您真的想使用 size_t
进行索引,循环可以表述如下。
for(size_t r = m.size(); r > 0; r--)
{
x[r-1] = f[r-1];
for(size_t c = r; c < m.size(); c++)
{
x[r-1] -= m[r-1][c] * x[c];
}
}
基本上,你会从m.size()
迭代到1
,并通过在循环内移动进行补偿;但这个解决方案可能有点难以遵循。在这个问题中,一个建议的解决方案是使用reverse_iterator
,这可以看作是索引的合适抽象。这个问题更深入地涵盖了整个主题。
最喜欢的方式:
std::size_t r = m.size();
while (r --> 0)
{
// access m[r]
}
好吧,您应该尽可能避免size_t
,因为它是一个无符号类型,至少在C++中表现不佳说到算术。 但无论哪种类型,通常我会用来反向迭代的成语(假设由于某种原因我不能只需使用反向迭代器,这将是自然的解决方案)将像这样:
int r = m.size(); // but size_t r would work here too.
while ( r > 0 ) {
-- r;
// ...
}
将递减移到循环的顶部可以解决大部分问题问题,恕我直言,这要清楚得多。
无符号算术在C++中定义得很好,所以我只想与"溢出"进行比较:
for (size_t r = m.size() - 1; r != -1; r--)
在循环条件中,-1
会自动转换为具有正确值的无符号。
使用 Boost.Range:
for (auto r : boost::irange(std::size_t(0), m.size()) | boost::adaptors::reversed) {
x[r] = f[r];
for (auto c : boost::irange(r + 1, m.size())) {
x[r] -= m[r][c] * x[c];
}
}
对于仍在搜索方法的任何人,请使用容器中的difference type
,只需在代码中进行轻微修改,而不是使用以下size_t r = m.size()-1
std::vector<T>::difference_type r = m.end()-m.begin()
或者您可以使用
std::ptrdiff_t r = m.end()-m.begin()
和循环将工作ptrdiff_t只是一个别名,用于标记 2 个迭代器之间的距离。
- 有什么方法可以遍历结构吗
- 在循环中按顺序遍历成员变量
- 遍历模板参数
- 在遍历处理程序的向量时注册和注销处理程序
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 遍历并行数组以确定C++中的最大数字
- 遍历顺序由 std::文件系统directory_iterator给出
- 遍历链表时的无限循环
- 遍历unordered_map向量
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- C++声明双链表,使用两个 for 循环双向遍历列表并打印
- 如何正确地推回然后遍历堆中对象的向量?
- 遍历二维数组的所有子数组
- 如何在可变参数模板函数中遍历可变参数元组?
- 避免在遍历 IShellItemArray 时出现代码重复
- 从特定键开始遍历地图
- 关于链表遍历和调试的困惑
- 将树节点添加到向量向量中的 n 元树遍历的平均和最坏情况时间复杂度是多少?
- 为什么即使使用 for 循环遍历我的向量,它也没有输出到控制台?(C++)
- 如何遍历列表,但在size-1处停止