我想遍历相反方向的矢量值。如您所知,向量的大小为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或者我应该将其转换为不感兴趣。
答案 0 :(得分:6)
如果您确实想使用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
并通过在循环内移动来补偿;但这个解决方案可能有点难以理解。在this question中,建议的解决方案是使用reverse_iterator
,它可以被视为索引的合适抽象。整个主题在this question中进行了更深入的介绍。
答案 1 :(得分:3)
这是我最喜欢的方式:
std::size_t r = m.size();
while (r --> 0)
{
// access m[r]
}
答案 2 :(得分:1)
嗯,你应该尽可能避免size_t
,因为它是一个
至少,无符号类型和无符号类型在C ++中的表现不佳
算术时。但不管类型如何,平时
我用来反向迭代(假设由于某种原因,我不能
只使用反向迭代器,这将是自然的解决方案
是这样的:
int r = m.size(); // but size_t r would work here too.
while ( r > 0 ) {
-- r;
// ...
}
将递减移动到循环的顶部解决了大部分问题 问题,恕我直言更清楚。
答案 3 :(得分:0)
无符号算术在C ++中是明确定义的,所以我只想比较&#34;溢出&#34;:
for (size_t r = m.size() - 1; r != -1; r--)
在循环条件中,-1
会自动转换为带有正确值的无符号。
答案 4 :(得分:0)
使用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];
}
}
答案 5 :(得分:0)
对于仍在搜索方法的任何人,请使用容器中的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只是一个别名,用于标记两个迭代器之间的距离。