Print a std::list in C++
This post will discuss how to print a std::list in C++.
Lists are sequence containers that are implemented as a doubly linked list and allow iteration in both directions and take O(1) time for insertion and deletion. They are usually slower than other standard sequence containers (arrays or vectors) to retrieve any item.
There are many ways to print a list in C++, which are covered below:
1. Using range-based for-loop
The recommended approach is to use the range-based for-loop to print elements in the list container. Please note that this will only work with C++11 , and later, with C++98 , we can use iterators.
How to display list items on console window in C#
I have a List that contains all databases names. I have to display the items contained in that list in the Console (using Console.WriteLine() ). How can I achieve this?
7 Answers 7
Actually you can do it pretty simple, since the list have a ForEach method and since you can pass in Console.WriteLine as a method group. The compiler will then use an implicit conversion to convert the method group to, in this case, an Action<int> and pick the most specific method from the group, in this case Console.WriteLine(int) :
Works with strings too =)
To be utterly pedantic (and I’m not suggesting a change to your answer — just commenting for the sake of interest) Console.WriteLine is a method group. The compiler then uses an implicit conversion from the method group to Action<int> , picking the most specific method ( Console.WriteLine(int) in this case).
While the answers with List<T>.ForEach are very good.
If separator is null, an empty string ( String.Empty ) is used instead. If any member of values is null, an empty string is used instead.
Join(String, IEnumerable<String>) is a convenience method that lets you concatenate each element in an IEnumerable(Of String) collection without first converting the elements to a string array. It is particularly useful with Language-Integrated Query (LINQ) query expressions.
This should work just fine for the problem, whereas for others, having array values. Use other overloads of this same method, String.Join Method (String, Object[])
Assuming the items override ToString appropriately:
(There’d be no advantage in using generics in this loop — we’d end up calling Console.WriteLine(object) anyway, so it would still box just as it does in the foreach part in this case.)
EDIT: The answers using List<T>.ForEach are very good.
My loop above is more flexible in the case where you have an arbitrary sequence (e.g. as the result of a LINQ expression), but if you definitely have a List<T> I’d say that List<T>.ForEach is a better option.
One advantage of List<T>.ForEach is that if you have a concrete list type, it will use the most appropriate overload. For example:
How to print all elements of a list in C#
Get Educative’s popular interview prep course for free.
The List<T> class in the System.Collection.Generic namespace represents a collection of strongly typed elements and offers many ways to iterate and manipulate the list.
Below are some of the ways to print the items of a C# list.
Creating a list of strings
Here, we create a list of months.
Using the for loop
The simplest method to access the elements is by using the for loop. We can access the individual items in the list by their index, months[i] , and then print the element using the Console.WriteLine() method.
Using the foreach loop
The foreach loop is a convenient construct to iterate through the items in a collection – it can be used to print the elements.
Using the ForEach method
The List<T> class provides the ForEach(Action<T>) method to perform a specified action on each of the list elements.
Универсальный список List
В C# для хранения набора однотипных элементов можно использовать массивы. Однако, что мы будем делать, если заранее не известно какое количество элементов нам необходимо хранить? Или же, количество элементов может постоянно меняться? Каждый раз создавать новый массив и копировать данные из одного массива в другой — не совсем правильный вариант. В таких случаях, наиболее удобно и правильно использовать универсальный список List<T> .
Класс List<T>
Класс List<T> представляет собой простейший универсальный список для хранения однородных объектов. Размер List<T> может динамически изменяться, а доступ к элементам списка осуществляется по целочисленному индексу. Ниже представлены основные свойства и методы List<T> :
- Метод void Add(T item) — добавление нового элемента в список
- Метод void AddRange(ICollection collection) — добавление в список коллекции или массива
- Метод int BinarySearch(T item) — бинарный поиск элемента в списке. Если элемент найден, то метод возвращает индекс этого элемента в коллекции. При этом список должен быть отсортирован.
- Метод int IndexOf(T item) — возвращает индекс первого вхождения элемента в списке
- Метод void Insert(int index, T item) — вставляет элемент item в списке на позицию index
- Метод bool Remove(T item) — удаляет элемент item из списка, и если удаление прошло успешно, то возвращает true
- Метод void RemoveAt(int index) — удаление элемента по указанному индексу index
- Метод void Sort() — сортировка списка
- Свойство Capacity — возвращает или задает общее число элементов, которые может вместить внутренняя структура данных без изменения размера
- Свойство Count — получает число элементов, содержащихся списке.
- Свойство Item[Int32] — возвращает или задает элемент по указанному индексу.
Как и в случае с любым универсальным типом, T — это любой тип данных, который будет использоваться при работе со списком, например, можно создать список строк:
Рассмотрим работу со списком List<T> на примере.
Пример создания и использования списка List<T> в C#
Результат работы программы будет следующий:
Во-первых, стоит обратить внимание на создание списка — здесь мы использовали конструктор с параметром в котором передели начальное значение емкости внутреннего хранилища списка (два элемента). После этого мы добавили в список не два, а пять элементов. Как можно увидеть, никаких ошибок программа не выдала, а в список попали все пять элементов и мы смогли их перечислить в цикле, а второй элемент вывести отдельно. При этом, свойство Capacity также автоматически изменилось и стало равным восьми.
Здесь может возникнуть сразу два закономерных вопроса:
- Зачем нам необходимо свойство Capacity у List<T> , если размер списка и так динамически изменяется?
- Что произойдет, если установить значение Capacity меньше, чем текущее количество элементов в списке?
Начнем со второго вопроса. Перепишем нашу программу следующим образом:
Как только мы запустим приложение, то сразу же получим исключение:
Отсюда следует, что, во-первых, нельзя устанавливать значение Capacity меньше, чем текущее количество элементов в списке и, во-вторых, для избежания исключительных ситуаций, свойство Capacity наиболее безопасно устанавливать ДО начала добавления элементов в список.
Что касается того, зачем нам, в принципе, необходимо свойство Capacity , то здесь нам поможет следующий пример:
Здесь мы создаем очень-очень большой список строк и наполняем его значениями в цикле, а затем — выводим затраченное время в консоль. Результат работы будет следующим:
Теперь перепишем нашу программу и при создании списка укажем ему сразу начальную емкость:
Как видно из результатов, даже при использовании списка с достаточно простыми типами данных (в нашем случае — это string ), начальное указание емкости хранилища позволяет сэкономить время работы программы, так как нам уже не потребуется динамически менять размеры внутреннего хранилища списка.
Также стоит отметить, что при динамическом изменении размера списка свойство Capacity изменяется на значение равному степени двойки, т.е. 2, 4, 8, 16 и т.д, что, опять же приводит к использованию лишней памяти нашей программой. Если вам необходимо, чтобы размер внутреннего хранилища соответствовал реальному количеству элементов в списке, необходимо использовать метод TrimExcess() , например:
Итого
Сегодня мы рассмотрели основные моменты по работе со списком List<T> в C#, научились создавать список, выводить значения из списка в консоль, а также разобрались с тем, зачем нам необходимо свойство Capacity и как его использовать.