У меня есть список

list<pair<Zeitpunkt, double>> l_tempdiff;

И я хочу только cout первых 5 элементов.

Я знаю только способ подсчета всего списка с помощью:

for (auto elem : l_tempdiff)
{
    cout << elem.first << elem.second << endl;
}

Я не знаю, как получить доступ к своим элементам, когда я использую:

for (it = l_tempdiff.begin(); it != l_tempdiff.end(); ++it)
{

}

И я думаю, мне нужно изменить l_tempdiff.end() на другое значение, но оно не t seem to take just the number 5`. Как я могу это сделать?

0
Craig Harrison 31 Авг 2017 в 16:20

4 ответа

Лучший ответ

Поскольку std::list итераторы не являются произвольным доступом, вы не можете просто увеличивать их, как l_tempdiff.begin() + 5. Что вы можете сделать, это использовать std::next, чтобы увеличить итератор необходимое количество раз. Это было бы похоже

for (auto it = l_tempdiff.begin(), end = std::next(l_tempdiff.begin(), 5); it != end; ++it)
{
    // use `*it` here
}

Прежде чем делать это, вы должны убедиться, что список достаточно большой, потому что в противном случае у вас будет неопределенное поведение.

1
NathanOliver 31 Авг 2017 в 13:52

Вы хотите вывести только первые пять элементов?
Хорошо, цикл for-range - хорошее место для начала, просто добавьте дополнительное ограничение в качестве условия останова:

int i = 0;
for (auto&& elem : l_tempdiff)
{
    if (5 < ++i) break;
    cout << elem.first << elem.second << endl;
}

Я изменяю auto на auto&&, чтобы избежать ненужного копирования.

Кроме того, подумайте над тем, чтобы прочитать « Почему» с использованием пространства имен std "считается плохой практикой? " и " C ++:" std: : endl "vs" \ n " ".

1
Deduplicator 31 Авг 2017 в 13:33
 list<pair<Zeitpunkt,double> > :: iterator it;
 int m = 0;
 it = l_tempdiff.begin();

 while( it != l_tempdiff.end() && m < 5)
 {
  cout<<it->second<<"\n"; 
  m++;
  it++;
 }
0
akp 31 Авг 2017 в 13:40

Пытаться

 auto it = l_tempdiff.begin();
 auto end = l_tempdiff.end();

 for (int count = 0; count < 5 && it != end; ++count)
 {
     std::cout << it->first << it->second << std::endl;
     std::advance(it);
 }

Это печатает первые пять пар (или все пары, если их меньше 5).

count используется для контроля максимального количества печатаемых элементов.

it является итератором, который на каждой итерации цикла ссылается на текущую пару.

Обратите внимание, что продвижение конечного итератора дает неопределенное поведение. Таким образом, необходимо завершить цикл, если достигнут конечный итератор (отсюда тест it != end в условии цикла) или если достигнуто максимальное количество элементов (5).

0
Peter 31 Авг 2017 в 13:58