c++ - 遍历 vector 中除第一个元素以外的所有元素

标签 c++ c++11 vector auto

假设我们有一个 vectorvector 并且我们将所有元素初始化为 0。

vector<vector<int>> P(MyObjects.size() + 1, vector<int>(MyBag.MaxCapacity + 1, 0));

我的问题是:

是否可以从 1 列开始迭代 vector 并在代码后以某种方式更改 1?

for (auto& row : P) //Tried to add (row + 1) : P but I'm receiving an Error
  {
    for (auto& elem : row) //Tried to add(elem + 1) : row but I'm receiving an Error
    {
       std::cout << elem << "  ";
    }
  }

我一直在 SO 和 Web 上寻找答案,但没有任何类似的东西。

我只对使用auto的解决方案感兴趣

编辑: 这是错误的输出

main.cpp:74:18: error: expected ‘;’ before ‘+’ token
   for (auto& row +1 : P)
                  ^
main.cpp:74:21: error: expected ‘;’ before ‘:’ token
   for (auto& row +1 : P)
                     ^
main.cpp:74:21: error: expected primary-expression before ‘:’ token
main.cpp:74:21: error: expected ‘)’ before ‘:’ token
main.cpp:74:21: error: expected primary-expression before ‘:’ token

还有一个我正在尝试使用的代码

for (auto& row + 1 : P)
  {
    for (auto& elem + 1 : row)
    {
     std::cout << elem << "  ";
    }
  }

是的,我知道我们可以使用下面的语法

for(vector< vector<int> >::iterator row = v.begin() + 1; row != v.end(); ++row) {
    for(vector<int>::iterator col = row->begin() + 1; col != row->end(); ++col) {
        cout << *col;
    }
}

但我不想用它。

最佳答案

这里冒号右边的表达式:

for (auto& row : P) { ... }
                ^^^

必须是 C++ 意义上的容器。您可以对其调用 begin()end() 的东西会产生两个相同(目前)类型的迭代器,其中该迭代器是可递增的、可比较的和可取消引用的.

如果您想做的是跳过容器中的第一个元素,您需要创建一个新的 P View ,它只是将第一个迭代器偏移了一。您正在修改的是您正在迭代的容器,而不是值。所以我们想要这样的东西:

for (auto& row : offset(P, 1)) { ... }

offset 采用一个容器和一个偏移量,它将应用于 Pbegin 迭代器:

template <class C>
iter_pair<iterator_t<C&>> offset(C& container, size_t skip) {
    return {std::next(container.begin(), skip), container.end()};
}

iter_pair 非常简单:

template <class It>
struct iter_pair {
    It b, e;

    It begin() const { return b; }
    It end() const { return e; }
};

iterator_t 是乐趣无穷。这是一个简化版本:

template <class C>
using iterator_t = decltype(std::begin(std::declval<C>()));

Demo

关于c++ - 遍历 vector 中除第一个元素以外的所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36826706/

相关文章:

c++ - 在 C++ 中,我怎样才能从一个对象到一个静态成员?

c++ - std::regex_match 找不到我的字符串格式的 RGB 颜色

c++ - 关于我游戏中继承的一个问题

c++ - 为什么从 std::string 的初始化列表中填充 std::vector 不调用 std::string 构造函数

c++ - std::make_shared、std::unique_ptr 和移动构造函数

c++ - 如何修复具有 unique_ptr 的对象的 vector

c++ - 如何在实时绘图中使用 QCustomPlot

c++ - 连接三个不同的对象

c - 什么是普通 C 中的 vector ?

c++ - 继承 vector/数组/列表并更改其大小