2014-10-14 2 views
0

Рассмотрите векторный контейнер объектов C++ с полями a и time. Мы хотим найти первый элемент в контейнере, который возникает после текущего времени (назовем его элементом N), а затем перебираем контейнер, начиная с первого элемента, который происходит в более раннее время с полем a, имеющим определенное значение (так в основном, из [N-1, inf)). Предполагая, что свойство не найдено, мы выполнили бы вторую итерацию по всему списку.Определение начальной позиции итератора

Будет ли работать следующий код? (в этом примере мы хотим найти последний элемент с помощью> = 5). Есть ли лучший способ сделать это?

myVectorType::const_iterator cBegin = myVectorObj.begin(); 
myVectorType::const_iterator cEnd = myVectorObj.end(); 

// Find the most recent item with a >= 5 
for (myVectorObj::const_iterator iter = cBegin; iter != cEnd; ++iter) 
{ 
    if ((*iter).time >= currentTime) 
    { 
    // Found an item that is in the future - we should have determined the location of the most 
    // recent item with the propery we're looking for. 
    break; 
    } 
    else if ((*iter).a >= 5) 
    { 
    // Past item with a >= 5. Save the location. 
    cBegin = iter; 
    } 
} 

// Iterate over the container, beginning at the most recent item with a >= 5, if it was found. 
for (; cBegin != cEnd; ++cBegin) 
{ 
    dostuff(); 
} 
+1

Это выглядит подозрительно, как школьное задание (особенно часть, где вы спрашиваете), будет ли работать следующий код? »- это означает, что вы не пытались скомпилировать или отлаживать этот код) – UnholySheep

+0

Если вектор отсортирован по времени, взгляд на std :: lower_bound –

ответ

0

Двухэтапный процесс. Во-первых, найти поле после того, как текущее время:

auto afterCurrent = std::find_if(myVectorObj.begin(), myVectorObj.end(), [=](const Field& field){ 
    return field.time >= currentTime; 
}); 

Затем найти элемент ПЕРЕД afterCurrent с> = 5

auto reverse = myVectorType::const_reverse_iterator(afterCurrent); 

auto atLeast5_rev = std::find_if(reverse, myVectorType.rend(), [=](const Field& field) { 
    return field.a >= 5; 
}); 

// convert back to forward iterator 
auto atLeast5 = --(atLeast5_rev.base()); 

Затем итерацию от atLeast5 до конца.

Смежные вопросы