Я использовал последовательность ясных и ул. в прошлом:
// clear, because eof or other bits may be still set.
s.clear();
s.str("");
, Который сделал вещь для обоих вводов и выводов stringstreams. С другой стороны, можно вручную очистить, затем искать соответствующую последовательность на начинание:
s.clear();
s.seekp(0); // for outputs: seek put ptr to start
s.seekg(0); // for inputs: seek get ptr to start
, Который предотвратит некоторые перераспределения, сделанные str
путем перезаписи того независимо от того, что находится в буфере вывода в настоящее время вместо этого. Результаты похожи на это:
std::ostringstream s;
s << "hello";
s.seekp(0);
s << "b";
assert(s.str() == "bello");
, Если Вы хотите использовать строку для c-функций, можно использовать std::ends
, помещая завершающийся пустой указатель как это:
std::ostringstream s;
s << "hello";
s.seekp(0);
s << "b" << std::ends;
assert(s.str().size() == 5 && std::strlen(s.str().data()) == 1);
std::ends
остатки устаревшего std::strstream
, который смог записать непосредственно в массив символов, который Вы выделили на стеке. Необходимо было вставить завершающийся пустой указатель вручную. Однако std::ends
не удерживается от использования, я думаю, потому что это все еще полезно как в вышеупомянутых случаях.
Подход Джона Фишера выглядит неплохо. Но если вы хотите придерживаться jQuery each, что довольно элегантно, попробуйте следующее (на основе подсказки JasonWoof установить таймауты на 5, 10 и т. Д.):
$("#div_image_thumb ul li").each(function (i) {
var $li = $(this);
setTimeout(function () { doThis($li); }, 5000 * (i + 1));
});
Что-то вроде этого должно работать правильно:
var elements = $("#div_image_thumb ul li");
var index = 0;
var doNext = null;
doNext = function() {
var element = elements.eq(index);
// do work
if (index < elements.length) {
index++;
setTimeout(doNext, 5000);
}
}
Я думаю, что проблема с вашим кодом заключается в том, что вы устанавливаете срок действия нескольких таймеров одновременно (через 5 секунд)
Таким образом, вам нужно либо установить один таймер, либо в течение 5 секунд с этого момента, и пусть он запускает следующий 5-секундный таймер, или вам нужно установить несколько таймеров на разное время, например, на 5, 10, 15, 20 и т. д.
На основании вашего комментария к принятому ответу - вы хотите продолжить цикл по коллекции элементов, для этого вы можете использовать setInterval и некоторые вспомогательные функции
$(function() {
var $lis = $("#div_image_thumb ul li");
var index = 0;
// setup a function to show the current one and increase the index
var doNext = function() {
// assuming doThis is defined somewhere else.
doThis($lis.eq(index));
// increment the index - if it is beyond the number of li's - reset it to 0
if (++index >= $lis.length) index = 0;
};
// call it once as we load
doNext();
// set it up to be called every 5000 ms
setInterval(doNext, 5000);
});