Оба цикла на основе диапазона и std::foreach
предназначены для обработки элементов самостоятельно, независимо от других. Если вам нужен итератор для других элементов, вам нужно явно указать его:
auto next = infoMap.begin();
for(auto& prev: infoMap)
{
++next; // now points to element succeeding prev...
if(next != infoMap.end())
{
// your code...
}
}
Цикл, основанный на контуре, не выполняет итерацию в обратном порядке, но идея в конце одна и та же:
auto next = infoMap.rbegin();
std::for_each(infoMap.rbegin(), infoMap.rend(), [&infoMap, &next](auto& prev)
{
++next; // again one in advance compared to prev...
// (other direction than in above loop, though!)
if(next != infoMap.rend())
{
// your code...
}
});
Я лично останусь с классическим циклом, хотя & ndash; это имеет то преимущество, что вы можете переместить if
из него:
if(infoMap.size() >= 2)
{
for (auto next = std::next(infoMap.rbegin()); next != infoMap.rend(); ++next)
{
prev = std::prev(next);
// your code...
}
}
Используйте TypeVar()
для объявления переменной типа и используйте Generic
в качестве базового класса.
from typing import TypeVar, Generic
T = TypeVar('T')
class Classy(Generic[T]):
def __init__(self, x: T) -> None:
self.value = x
def get_value(self) -> T:
return self.value
Вы можете попробовать:
class1 = Classy[int](100)
class2 = Classy[str]('abc')
print(class1.get_value())
print(class2.get_value())
Тогда вы увидите:
100
abc