2013-12-06 2 views
1

У меня есть цикл, который идет Еогеасп хотя std::set, который выглядит какКак определить, является ли текущий элемент в наборе последним элементом?

for (auto& line : lines){ 
    //use line 
    bool end = /* Check if line is the last element */ 
} 

С в std::vector я мог проверить &line == &lines.back();

Есть ли способ, что я могу сделать что-то подобное для std::set?

+0

Я предполагаю '& line == & * lines.end()', но это кажется немного сомнительным. – chris

+0

@chris, вы можете захотеть выбросить '- 1' в' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' – zneak

+0

@zneak, Упс, определенно нет. – chris

ответ

0

zneak имеет некоторые довольно хорошие идеи, но вот один из которых охватывает итераторы в цикл:

std::set<std::string> lines; 
lines.insert("Hello"); 
lines.insert("Thar"); 
lines.insert("How"); 
lines.insert("Goes"); 
lines.insert("It"); 
for (const auto& line : lines) { 
    auto it = lines.find(line); 
    it++; 
    std::cout << std::boolalpha << (it == lines.end()) << std::endl; 
} 
+0

Надеюсь, вы поймете, что ваше решение работает в логарифмическом времени. Логарифмический, как правило, довольно хорош, но для чего-то так легко сделать в постоянное время, это немного разочаровывает. – zneak

2

Нет, потому что у комплекта нет передней или задней. Тем не менее, вы можете, если вы использовали итераторы:

for (auto iter = lines.begin(); iter != lines.end(); iter++) 
{ 
    bool end = iter + 1 == set.end(); 
} 

В качестве альтернативы, вы можете посчитать, сколько предметов вы итерация:

size_t count = 0; 
for (auto& line : lines) 
{ 
    count++; 
    if (count == set.size()) // this is the last element 
} 
0

Как об этом пути,

auto iter = lines.cend(); 
if (iter!=lines.cbegin()) 
    --iter; 
for (auto &line : lines) 
{ 
    if (*iter==line) // end of the set 
    {} 
} 
Смежные вопросы