Если вы используете Unix,
import signal
...
class Alarm(Exception):
pass
def alarm_handler(signum, frame):
raise Alarm
signal.signal(signal.SIGALRM, alarm_handler)
signal.alarm(5*60) # 5 minutes
try:
stdoutdata, stderrdata = proc.communicate()
signal.alarm(0) # reset the alarm
except Alarm:
print "Oops, taking too long!"
# whatever else
Вы бы просто использовали пару итераторов:
typedef std::vector<int>::iterator vec_iter;
void doSomething(vec_iter first, vec_iter last) {
for (vec_iter cur = first; cur != last; ++cur) {
std::cout << *cur << endl;
}
}
int main() {
std::vector v();
for (int i= 0; i < 10; ++i) { v.push_back(i); }
doSomething(v.begin() + 1, v.begin() + 5);
doSomething(v.begin() + 2, v.begin() + 4);
return 0;
}
В качестве альтернативы, библиотека Boost.Range должна позволять вам представлять пары итераторов как один объект, но приведенный выше канонический способ сделай это.
Вы можете представить эти «срезы» с помощью пары итераторов.
Как говорили другие, вы можете представить «срез» как пару итераторов. Если вы хотите использовать Boost, вы можете использовать концепцию диапазона. Тогда вам будут доступны даже функции-члены begin () / end (), и все это будет очень похоже на контейнер.