遍历向量中除第一个元素以外的所有元素
Iterating over all but the first element in a vector
假设我们有 vector
个 vector
并且我们将所有元素初始化为 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
的解决方案感兴趣
编辑:
这是 Errors
的输出
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
接受一个容器和一个偏移量,它将应用于 P
的 begin
迭代器:
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>()));
假设我们有 vector
个 vector
并且我们将所有元素初始化为 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
编辑: 这是 Errors
的输出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
接受一个容器和一个偏移量,它将应用于 P
的 begin
迭代器:
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>()));