Python 在 C++ 中的枚举
Python's enumerate in c++
在 Python 中,而不是
colors = ['red', 'green', 'blue', 'yellow']
for i in range(len(colors)):
print i, '--->', colors[i]
能写
for i, color in enumerate(colors):
print i, '--->', color
c++有类似的东西吗?
Boost 提供了一个适配器,可以做类似的事情:
以下代码取自上面的link
#include <boost/range/adaptor/indexed.hpp>
#include <boost/assign.hpp>
#include <iterator>
#include <iostream>
#include <vector>
int main(int argc, const char* argv[])
{
using namespace boost::assign;
using namespace boost::adaptors;
std::vector<int> input;
input += 10,20,30,40,50,60,70,80,90;
for (const auto& element : input | indexed(0))
{
std::cout << "Element = " << element.value()
<< " Index = " << element.index()
<< std::endl;
}
return 0;
}
也许你可以这样模拟:
int i = 0;
for (auto color : { "red", "green", "blue", "yellow" })
std::cout << i++ << "--->" << color << std::endl;
你实际上可以在 c++17 中实现类似的东西。
这是一个草图(c++-ish 伪代码),我到处都使用值,它们应该被适当的 references/forwarding 替换,你也应该修复你如何获得类型(使用 iterator_traits),可能支持未知大小,可能实现适当的迭代器接口等
template <typename T>
struct EnumeratedIterator {
size_t index;
T iterator;
void operator++() {
++iterator;
}
std::pair<size_t, T>() {
return {index, *iterator};
}
bool operator !=(EnumeratedIterator o) {
return iterator != o.iterator;
}
}
template <typename T>
struct Enumerated {
T collection;
EnumeratedIterator<typename T::iterator> begin() {
return {0, collection.begin()};
}
EnumeratedIterator<typename T::iterator> end() {
return {collection.size(), collection.end()};
}
}
auto enumerate(T col) {
return Enumerated<T>(col);
}
然后像
一样使用它
for (auto [index, color] : enumerate(vector<int>{5, 7, 10})) {
assert(index < color);
}
在 Python 中,而不是
colors = ['red', 'green', 'blue', 'yellow']
for i in range(len(colors)):
print i, '--->', colors[i]
能写
for i, color in enumerate(colors):
print i, '--->', color
c++有类似的东西吗?
Boost 提供了一个适配器,可以做类似的事情:
以下代码取自上面的link
#include <boost/range/adaptor/indexed.hpp>
#include <boost/assign.hpp>
#include <iterator>
#include <iostream>
#include <vector>
int main(int argc, const char* argv[])
{
using namespace boost::assign;
using namespace boost::adaptors;
std::vector<int> input;
input += 10,20,30,40,50,60,70,80,90;
for (const auto& element : input | indexed(0))
{
std::cout << "Element = " << element.value()
<< " Index = " << element.index()
<< std::endl;
}
return 0;
}
也许你可以这样模拟:
int i = 0;
for (auto color : { "red", "green", "blue", "yellow" })
std::cout << i++ << "--->" << color << std::endl;
你实际上可以在 c++17 中实现类似的东西。
这是一个草图(c++-ish 伪代码),我到处都使用值,它们应该被适当的 references/forwarding 替换,你也应该修复你如何获得类型(使用 iterator_traits),可能支持未知大小,可能实现适当的迭代器接口等
template <typename T>
struct EnumeratedIterator {
size_t index;
T iterator;
void operator++() {
++iterator;
}
std::pair<size_t, T>() {
return {index, *iterator};
}
bool operator !=(EnumeratedIterator o) {
return iterator != o.iterator;
}
}
template <typename T>
struct Enumerated {
T collection;
EnumeratedIterator<typename T::iterator> begin() {
return {0, collection.begin()};
}
EnumeratedIterator<typename T::iterator> end() {
return {collection.size(), collection.end()};
}
}
auto enumerate(T col) {
return Enumerated<T>(col);
}
然后像
一样使用它for (auto [index, color] : enumerate(vector<int>{5, 7, 10})) {
assert(index < color);
}