使用size_t值以反方向遍历向量

时间:2014-12-10 13:27:43

标签: c++ vector

我想遍历相反方向的矢量值。如您所知,向量的大小为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或者我应该将其转换为不感兴趣。

6 个答案:

答案 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只是一个别名,用于标记两个迭代器之间的距离