如何在不使用循环的情况下生成未知数量的项目列表
How to generate a list of unknown number of items without using a loop
如果我不知道列表中有多少项,是否可以在不使用循环的情况下生成项目列表?
这是一个例子(使用循环):
vector<int> bits(int N) {
vector<int> v;
while (N != 0) {
v.push_back(N & 1);
N >>= 1;
}
return v;
}
在这个例子中,我事先不知道返回的向量会有多少项。虽然使用循环来实现此功能完全没问题,但我的问题(因为我正在尝试学习 C++ 和 STL)是是否有一种方法可以做同样的事情但没有任何循环。
如果您绝对坚持不遗余力地让 STL 为您 运行 循环,那么也许是这样的:
class BitIterator {
public:
using value_type = int;
using difference_type = std::size_t;
using pointer = int*;
using reference = int&;
using iterator_category = std::input_iterator_tag;
BitIterator(int n = 0) : n_(n) {}
int operator*() const { return n_ & 1; }
BitIterator& operator++() { n_ >>= 1; return *this; }
bool operator==(const BitIterator& other) const { return n_ == other.n_; }
bool operator!=(const BitIterator& other) const { return n_ != other.n_; }
private:
int n_ = 0;
};
std::vector<int> bits(int N) {
return {BitIterator(N), BitIterator(0)};
}
如果我不知道列表中有多少项,是否可以在不使用循环的情况下生成项目列表?
这是一个例子(使用循环):
vector<int> bits(int N) {
vector<int> v;
while (N != 0) {
v.push_back(N & 1);
N >>= 1;
}
return v;
}
在这个例子中,我事先不知道返回的向量会有多少项。虽然使用循环来实现此功能完全没问题,但我的问题(因为我正在尝试学习 C++ 和 STL)是是否有一种方法可以做同样的事情但没有任何循环。
如果您绝对坚持不遗余力地让 STL 为您 运行 循环,那么也许是这样的:
class BitIterator {
public:
using value_type = int;
using difference_type = std::size_t;
using pointer = int*;
using reference = int&;
using iterator_category = std::input_iterator_tag;
BitIterator(int n = 0) : n_(n) {}
int operator*() const { return n_ & 1; }
BitIterator& operator++() { n_ >>= 1; return *this; }
bool operator==(const BitIterator& other) const { return n_ == other.n_; }
bool operator!=(const BitIterator& other) const { return n_ != other.n_; }
private:
int n_ = 0;
};
std::vector<int> bits(int N) {
return {BitIterator(N), BitIterator(0)};
}