【发布时间】:2020-06-01 23:14:25
【问题描述】:
我希望在 C++ 中实现与此 Python 代码等效的更少(但内存效率更高):
a = [1, 5, 3]
additional = 6
for elem in [additional] + a:
print(elem) # prints: 6 1 5 3
# alternative without creating the additional vector:
import itertools
for elem in itertools.chain([additional], a):
print(elem)
我知道在 C++ 中执行此操作的唯一方法是:
#include <iostream>
#include <vector>
int main() {
std::vector<int> a = {1, 5, 3};
int additional = 6;
for (int i = 0; i < a.size() + 1; ++i) {
int cur_elem;
if (i == 0) {
cur_elem = additional;
} else {
cur_elem = a[i-1];
}
std::cout << cur_elem << std::endl;
}
}
有没有办法使用基于范围的 for 循环来做到这一点?我找到了 Boost 连接运算符,但它似乎只使用可迭代对象,因此我需要创建一个额外的向量(如 Python 示例中所示)。
理想情况下,迭代不会在内存中创建连接对象并使用标准库的算法。
【问题讨论】:
-
为什么不在循环之前打印出来?
-
当你想在基于循环的范围内做一些不寻常的事情时,你总是可以编写一个自定义的迭代器类型来做任何你想做的事情。
-
这能回答你的问题吗? Why no push/pop in front of vector? 基本上,
push_front()附加到集合的开头,但您应该使用std::list而不是vector。 -
@KenY-N
std::list的正当理由很少见。基本上,除非迭代器/引用失效规则对您的应用程序非常重要,否则可能有比std::list更好的容器。这里是std::deque。 -
@KenY-N 另外,他提到他想避免仅仅为了迭代而创建一个新容器,我同意他的观点。事实上,新范围库的卖点之一就是能够轻松做到这一点。 (我的观点是我不认为这是上述问题的重复)
标签: c++ for-loop iterator range