LINUX.ORG.RU

массив списков

 , ,


0

2

гуглил, честно.

std::vector<std::list<std::string> arr;
std::list<std::string> li;



for (auto i = arr.begin(); i != arr.end(); ++i) {
    for (auto k = i->begin(); k != i->end(); ++k) {
        if (k == li.begin()){ // если это первый элемент в списке
            // то сделать действие
        }else {
           // для второго и последующих.
        }
    }
}

Почему k == li.begin() не срабатывает?

★★★★★

А чего вообще сравниваются итераторы из разных контейнеров? Это же не имеет смысла.

xaizek ★★★★★
()
Ответ на: комментарий от sniper21

Но это же разные объекты списков. Это как сравнивать указатель на элемент одного массива с началом другого массива.

xaizek ★★★★★
()
Последнее исправление: xaizek (всего исправлений: 1)

if k == i->begin()

anonymous
()
Ответ на: комментарий от sniper21

если это первый элемент в списке

Может там разименование указателей подразумевалось? Или сравнивается не с тем, как аноним предлагает (но я тогда не понимаю, зачем вторая переменная приведена).

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Есть массив списков. Проходя по массиву, нужно для первого элемента в списке (не массива) сделать одно действие, а для других - другое.

sniper21 ★★★★★
() автор топика
Ответ на: комментарий от sniper21

Тогда аноним правильно сказал:

if (k == i->begin()) {

xaizek ★★★★★
()

Ещё вот так можно

std::vector<std::list<std::string> arr;

for (auto i = arr.begin(); i != arr.end(); ++i) {
    auto k = i->begin();
    if (k != i->end())
    {
        // тут действие для первого элемента
        ++k;
    }
    for (; k != i->end(); ++k) {
        // для второго и последующих.
        }
    }
}
Плюсы - не будет if в цикле. Говорят if в цикле плохую производительность выдаёт...

fsb4000 ★★★★★
()
Ответ на: комментарий от fsb4000

Это __прекрасно__.

Всё таки не понимаю я вот это

for (; k != i->end(); ++k) {

цикл от какого элемента начинается?

sniper21 ★★★★★
() автор топика
Ответ на: комментарий от sniper21

цикл от какого элемента начинается?

От того, на который указывал k на момент начала.
Если в списке были элементы, то выполнилось действие для первого (с индексом 0) и индекс сдвинулся до 1. Цикл начинается с 1 (следующего за 0).
Если в списке элементов не было, то k останется указывать на самое начало массива, т.е. 0. Тело цикла в этом случае вообще не будет выполняться.

E ★★★
()
Ответ на: комментарий от sniper21

Всё таки не понимаю я вот это

Прочитай ещё раз описание циклов for.

Вкратце — там три выражения. Ни одно из них не является обязательным. Поэтому даже конструкция for(;;) вполне корректна.

i-rinat ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.