Перейти к содержимому

Как использовать библиотеку list в с

  • автор:

Класс list

Класс списка стандартной библиотеки C++ — это шаблон класса контейнеров последовательностей, которые поддерживают их элементы в линейном расположении и разрешают эффективные вставки и удаления в любом расположении в последовательности. Последовательность хранится в виде двунаправленного связанного списка элементов, каждый из которых содержит элемент определенного типа Type .

Синтаксис

template > class list 

Параметры

Type
Тип данных элементов, сохраняемых в списке.

Allocator
Тип, представляющий сохраненный объект распределителя, содержащий сведения о распределении списка и отмене распределения памяти. Этот аргумент является необязательным, и в качестве значения по умолчанию используется allocator .

Замечания

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

Функции-члены merge списка , reverse , remove unique и были оптимизированы для работы с объектами списка и remove_if предлагают высокопроизводительную альтернативу их универсальным аналогам.

Перераспределение списка происходит, когда функция-член должна вставить или удалить элементы списка. Во всех таких случаях только итераторы или ссылки, указывающие на удаленные части последовательности, становятся недействительными .

Включите стандартный заголовок стандартной библиотеки C++ для определения container списка шаблонов классов и нескольких вспомогательных шаблонов.

Участники

Конструкторы

Имя Описание
list Создает список определенного размера, или с элементами определенного значения, или с определенным allocator , или в качестве копии какого-либо другого списка.

Определения типов

Имя Описание
allocator_type Тип, представляющий класс allocator для объекта списка.
const_iterator Тип, предоставляющий двунаправленный итератор, который может читать элемент const в списке.
const_pointer Тип, предоставляющий указатель на элемент const в списке.
const_reference Тип, предоставляющий ссылку на элемент const , хранящийся в списке, для чтения и выполнения операций const .
const_reverse_iterator Тип, предоставляющий двунаправленный итератор, который может читать любой элемент const в списке.
difference_type Тип, предоставляющий разницу между двумя итераторами, ссылающимися на элементы в одном и том же списке.
iterator Тип, предоставляющий двунаправленный итератор, который может читать или изменять любой элемент в списке.
pointer Тип, предоставляющий указатель на элемент в списке.
reference Тип, предоставляющий ссылку на элемент const , хранящийся в списке, для чтения и выполнения операций const .
reverse_iterator Тип, предоставляющий двунаправленный итератор, который может читать или изменять любой элемент в обратном списке.
size_type Тип, считающий количество элементов в списке.
value_type Тип, представляющий тип данных, хранящихся в списке.

Функции

Имя Описание
assign Удаляет элементы из списка и копирует новый набор элементов в список назначения.
back Возвращает ссылку на последний элемент в списке.
begin Возвращает итератор, адресующий первый элемент в списке.
cbegin Возвращает константный итератор, адресующий первый элемент в списке.
cend Возвращает константный итератор, адресующий расположение после последнего элемента в списке.
clear Удаляет все элементы списка.
crbegin Возвращает константный итератор, адресующий первый элемент в обратном списке.
crend Возвращает константный итератор, адресующий расположение после последнего элемента в обратном списке.
emplace Вставляет элемент, созданный на месте, в указанное положение в списке.
emplace_back Добавляет элемент, созданный на месте, в конец списка.
emplace_front Добавляет элемент, созданный на месте, в начало списка.
empty Проверяет, пуст ли список.
end Возвращает итератор, адресующий расположение после последнего элемента в списке.
erase Удаляет элемент или диапазон элементов с указанных положений в списке.
front Возвращает ссылку на первый элемент в списке.
get_allocator Возвращает копию объекта объекта allocator , использованного для создания списка.
insert Вставляет элемент или количество элементов или диапазон элементов в указанное положение в списке.
max_size Возвращает максимальную длину списка.
merge Удаляет элементы из списка аргументов, вставляет их в список назначения и сортирует новый объединенный набор элементов по возрастанию или в ином указанном порядке.
pop_back Удаляет элемент в конце списка.
pop_front Удаляет элемент в начале списка.
push_back Добавляет элемент в конец списка.
push_front Добавляет элемент в начало списка.
rbegin Возвращает итератор, адресующий первый элемент в обратном списке.
remove Удаляет из списка элементы, совпадающие с заданным значением.
remove_if Удаляет из списка элементы, для которых выполняется заданный предикат.
rend Возвращает итератор, адресующий расположение после последнего элемента в обратном списке.
resize Указывает новый размер списка.
reverse Изменяет порядок следования элементов в списке на обратный.
size Возвращает количество элементов в списке.
sort Упорядочивает элементы списка по возрастанию или в другом порядке.
splice Удаляет элементы из списка аргументов и вставляет их в список назначения.
swap Меняет местами элементы двух списков.
unique Удаляет из списка повторяющиеся соседние элементы или соседние элементы, удовлетворяющие условию какого-либо другого двоичного предиката.

Операторы

Имя Описание
operator= Заменяет элементы списка копией другого списка.

Требования

Заголовок:

allocator_type

Тип, представляющий класс распределителя для объекта списка.

typedef Allocator allocator_type; 

Замечания

allocator_type является синонимом для параметра-шаблона Allocator .

Пример

Пример см. в примере get_allocator .

assign

Удаляет элементы из списка и копирует новый набор элементов в список назначения.

void assign( size_type Count, const Type& Val); void assign initializer_list IList); template void assign( InputIterator First, InputIterator Last); 

Параметры

First
Положение первого элемента в диапазоне элементов, копируемых из списка аргументов.

Last
Положение первого элемента после диапазона элементов, копируемых из списка аргументов.

Count
Количество копий элемента, вставляемых в список.

Val
Значение элемента, вставляемого в список.

IList
Список initializer_list содержит вставляемые элементы.

Замечания

После удаления любых существующих элементов в списке назначения операция назначения либо вставляет указанный диапазон элементов из исходного списка или какого-либо другого списка в список назначения, либо вставляет копии нового элемента указанного значения в список назначения

Пример

// list_assign.cpp // compile with: /EHsc #include #include int main() < using namespace std; listc1, c2; list::const_iterator cIter; c1.push_back(10); c1.push_back(20); c1.push_back(30); c2.push_back(40); c2.push_back(50); c2.push_back(60); cout ); cout
c1 = 10 20 30c1 = 50 60c1 = 4 4 4 4 4 4 4c1 = 10 20 30 40 

back

Возвращает ссылку на последний элемент в списке.

reference back(); const_reference back() const; 

Возвращаемое значение

Последний элемент списка. Если список пуст, возвращаемое значение не определено.

Замечания

Если возвращаемое значение back назначается const_reference , то объект списка невозможно изменить. Если возвращаемое значение back назначается reference , то объект списка изменить нельзя.

При компиляции с помощью _ITERATOR_DEBUG_LEVEL определенного значения 1 или 2 при попытке получить доступ к элементу в пустом списке возникнет ошибка среды выполнения. Дополнительные сведения см. в разделе Checked Iterators .

Пример

// list_back.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; list c1; c1.push_back( 10 ); c1.push_back( 11 ); int& i = c1.back( ); const int& ii = c1.front( ); cout
The last integer of c1 is 11 The next-to-last integer of c1 is 10 

begin

Возвращает итератор, адресующий первый элемент в списке.

const_iterator begin() const; iterator begin(); 

Возвращаемое значение

Двунаправленный итератор, адресующий расположение первого элемента в списке или расположение после пустого списка.

Замечания

Если возвращаемое значение begin присваивается объекту const_iterator , элементы в объекте списка не могут быть изменены. Если возвращаемое значение begin назначено iterator объекту, элементы в объекте списка можно изменить.

Пример

// list_begin.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; list c1; list ::iterator c1_Iter; list ::const_iterator c1_cIter; c1.push_back( 1 ); c1.push_back( 2 ); c1_Iter = c1.begin( ); cout 
The first element of c1 is 1 The first element of c1 is now 20 

cbegin

Возвращает итератор const , направленный на первый элемент в диапазоне.

const_iterator cbegin() const; 

Возвращаемое значение

Итератор двунаправленного доступа const , который указывает на первый элемент диапазона или расположение прямо за концом пустого диапазона ( cbegin() == cend() для пустого диапазона).

Замечания

Элементы в диапазоне нельзя изменить с помощью возвращаемого значения cbegin .

Эту функцию-член можно использовать вместо функции-члена begin() , чтобы гарантировать, что возвращаемое значение будет const_iterator . Как правило, он используется в сочетании с ключевое слово вычета auto типов, как показано в следующем примере. В примере Container следует рассматривать как изменяемый (не- const ) контейнер любого вида, который поддерживает begin() и cbegin() .

auto i1 = Container.begin(); // i1 is Container::iterator auto i2 = Container.cbegin(); // i2 is Container::const_iterator 

cend

Возвращает итератор const , который обращается к месту, следующему сразу за последним элементом в диапазоне.

const_iterator cend() const; 

Возвращаемое значение

Итератор двунаправленного доступа const , который указывает на позицию сразу за концом диапазона.

Замечания

cend используется для проверки того, прошел ли итератор конец диапазона.

Эту функцию-член можно использовать вместо функции-члена end() , чтобы гарантировать, что возвращаемое значение будет const_iterator . Как правило, он используется в сочетании с ключевое слово вычета auto типов, как показано в следующем примере. В примере Container следует рассматривать как изменяемый (не- const ) контейнер любого вида, который поддерживает end() и cend() .

auto i1 = Container.end(); // i1 is Container::iterator auto i2 = Container.cend(); // i2 is Container::const_iterator 

Значение, возвращаемое cend , не должно быть подвергнуто удалению ссылки.

clear

Удаляет все элементы списка.

void clear(); 

Пример

// list_clear.cpp // compile with: /EHsc #include #include int main() < using namespace std; list c1; c1.push_back( 10 ); c1.push_back( 20 ); c1.push_back( 30 ); cout
The size of the list is initially 3 The size of list after clearing is 0 

const_iterator

Тип, предоставляющий двунаправленный итератор, который может читать элемент const в списке.

typedef implementation-defined const_iterator; 

Замечания

Тип const_iterator нельзя использовать для изменения значения элемента.

Пример

Пример см. в примере back .

const_pointer

Предоставляет указатель на элемент const в списке.

typedef typename Allocator::const_pointer const_pointer; 

Замечания

Тип const_pointer нельзя использовать для изменения значения элемента.

В большинстве случаев iterator следует использовать для доступа к элементам в объекте списка.

const_reference

Тип, предоставляющий ссылку на элемент const , хранящийся в списке, для чтения и выполнения операций const .

typedef typename Allocator::const_reference const_reference; 

Замечания

Тип const_reference нельзя использовать для изменения значения элемента.

Пример

// list_const_ref.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; list c1; c1.push_back( 10 ); c1.push_back( 20 ); const list c2 = c1; const int &i = c2.front( ); const int &j = c2.back( ); cout 
The first element is 10 The second element is 20 

const_reverse_iterator

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

typedef std::reverse_iterator const_reverse_iterator; 

Замечания

Тип const_reverse_iterator не может изменять значение элемента и используется для последовательного прохождения через список в обратную сторону.

Пример

Пример см. в примере rbegin .

crbegin

Возвращает константный итератор, адресующий первый элемент в обратном списке.

const_reverse_iterator rbegin() const; 

Возвращаемое значение

Константный обратный двунаправленный итератор, адресующий первый элемент в обратном списке (или адресующий элемент, ранее бывший первым элементом в list до изменения его порядка на обратный).

Замечания

crbegin используется с обратным списком так же, как list::begin используется с list .

Если возвращаемое значение crbegin , то объект списка невозможно изменить. list::rbegin можно использовать для последовательного прохождения по списку в обратную сторону.

Пример

// list_crbegin.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; list c1; list ::const_reverse_iterator c1_crIter; c1.push_back( 10 ); c1.push_back( 20 ); c1.push_back( 30 ); c1_crIter = c1.crbegin( ); cout
The last element in the list is 30. 

crend

Возвращает константный итератор, адресующий расположение после последнего элемента в обратном списке.

const_reverse_iterator rend() const; 

Возвращаемое значение

Обратный двунаправленный итератор констант, который обращается к расположению, успешному последнему элементу в обратном list направлении (расположение, предшествовающее первому элементу в непровернутом list ).

Замечания

crend используется с обратным списком так же, как list::end используется с list .

Если возвращаемое значение crend , то объект list невозможно изменить.

crend используется, чтобы проверить, достиг ли итератор конца list .

Значение, возвращаемое crend , не должно быть подвергнуто удалению ссылки.

Пример

// list_crend.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; list c1; list ::const_reverse_iterator c1_crIter; c1.push_back( 10 ); c1.push_back( 20 ); c1.push_back( 30 ); c1_crIter = c1.crend( ); c1_crIter --; // Decrementing a reverse iterator moves it forward in // the list (to point to the first element here) cout
The first element in the list is: 10 

difference_type

Тип целого числа со знаком, который можно использовать для представления количества элементов в списке в диапазоне между элементами, на которые указывают итераторы.

typedef typename Allocator::difference_type difference_type; 

Замечания

difference_type — тип, возвращаемый при вычитании или приращении через итераторы контейнера. difference_type обычно используется для представления количества элементов в диапазоне [ first , last ) между итераторами first и last , включая элемент, на который указывает first , и диапазон элементов до, но не включая элемент, на который указывает last .

Обратите внимание, что difference_type хотя итератор доступен для всех итераторов, удовлетворяющих требованиям входного итератора, который включает класс двунаправленных итераторов, поддерживаемых обратимыми контейнерами, например набором, вычитание между итераторами поддерживается только средствами случайного доступа, предоставляемыми контейнером случайного доступа, например vector классом.

Пример

// list_diff_type.cpp // compile with: /EHsc #include #include #include int main( ) < using namespace std; list c1; list ::iterator c1_Iter, c2_Iter; c1.push_back( 30 ); c1.push_back( 20 ); c1.push_back( 30 ); c1.push_back( 10 ); c1.push_back( 30 ); c1.push_back( 20 ); c1_Iter = c1.begin( ); c2_Iter = c1.end( ); list ::difference_type df_typ1, df_typ2, df_typ3; df_typ1 = count( c1_Iter, c2_Iter, 10 ); df_typ2 = count( c1_Iter, c2_Iter, 20 ); df_typ3 = count( c1_Iter, c2_Iter, 30 ); cout
The number '10' is in c1 collection 1 times. The number '20' is in c1 collection 2 times. The number '30' is in c1 collection 3 times. 

emplace

Вставляет элемент, созданный на месте, в указанное положение в списке.

void emplace(iterator Where, Type&& val); 

Параметры

Where
Позиция в целевом объекте list , где вставляется первый элемент.

val
Элемент, добавляемый в конец list .

Замечания

При создании исключения list не изменяется, а исключение создается снова.

Пример

// list_emplace.cpp // compile with: /EHsc #include #include #include int main( ) < using namespace std; list c2; string str("a"); c2.emplace(c2.begin(), move( str ) ); cout
Moved first element: a 

emplace_back

Добавляет элемент, созданный на месте, в конец списка.

void emplace_back(Type&& val); 

Параметры

val
Элемент, добавляемый в конец list .

Замечания

При создании исключения list не изменяется, а исключение создается снова.

Пример

// list_emplace_back.cpp // compile with: /EHsc #include #include #include int main( ) < using namespace std; list c2; string str("a"); c2.emplace_back( move( str ) ); cout
Moved first element: a 

emplace_front

Добавляет элемент, созданный на месте, в начало списка.

void emplace_front(Type&& val); 

Параметры

val
Элемент, добавленный в начало list элемента .

Замечания

При создании исключения list не изменяется, а исключение создается снова.

Пример

// list_emplace_front.cpp // compile with: /EHsc #include #include #include int main( ) < using namespace std; list c2; string str("a"); c2.emplace_front( move( str ) ); cout
Moved first element: a 

empty

Проверяет, пуст ли список.

bool empty() const; 

Возвращаемое значение

true Значение , если список пуст; false Значение , если список не пуст.

Пример

// list_empty.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; list c1; c1.push_back( 10 ); if ( c1.empty( ) ) cout
The list is not empty. 

end

Возвращает итератор, адресующий расположение после последнего элемента в списке.

const_iterator end() const; iterator end(); 

Возвращаемое значение

Двунаправленный итератор, адресующий расположение после последнего элемента в списке. Если список пуст, то list::end == list::begin .

Замечания

end используется для проверки того, достиг ли итератор конца списка.

Пример

// list_end.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; list c1; list ::iterator c1_Iter; c1.push_back( 10 ); c1.push_back( 20 ); c1.push_back( 30 ); c1_Iter = c1.end( ); c1_Iter--; cout << "The last integer of c1 is " << *c1_Iter << endl; c1_Iter--; *c1_Iter = 400; cout << "The new next-to-last integer of c1 is " << *c1_Iter << endl; // If a const iterator had been declared instead with the line: // list ::const_iterator c1_Iter; // an error would have resulted when inserting the 400 cout
The last integer of c1 is 30 The new next-to-last integer of c1 is 400 The list is now: 10 400 30 

erase

Удаляет элемент или диапазон элементов с указанных положений в списке.

iterator erase(iterator Where); iterator erase(iterator first, iterator last); 

Параметры

Where
Положение элемента, удаляемого из списка.

first
Положение первого элемента, удаленного из списка.

last
Положение после последнего элемента, удаленного из списка.

Возвращаемое значение

Двунаправленный итератор, указывающий на первый элемент, оставшийся после удаленных элементов, или на указатель конца списка, если такого элемента не существует.

Замечания

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

erase никогда не создает исключений.

Пример

// list_erase.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; list c1; list ::iterator Iter; c1.push_back( 10 ); c1.push_back( 20 ); c1.push_back( 30 ); c1.push_back( 40 ); c1.push_back( 50 ); cout
The initial list is: 10 20 30 40 50 After erasing the first element, the list becomes: 20 30 40 50 After erasing all elements but the first, the list becomes: 20 

front

Возвращает ссылку на первый элемент в списке.

reference front(); const_reference front() const; 

Возвращаемое значение

Если список пуст, возвращаемое значение не определено.

Замечания

Если возвращаемое значение front назначается const_reference , то объект списка невозможно изменить. Если возвращаемое значение front назначается reference , то объект списка изменить нельзя.

При компиляции с помощью _ITERATOR_DEBUG_LEVEL определенного значения 1 или 2 при попытке получить доступ к элементу в пустом списке возникнет ошибка среды выполнения. Дополнительные сведения см. в разделе Checked Iterators .

Пример

// list_front.cpp // compile with: /EHsc #include #include int main() < using namespace std; list c1; c1.push_back( 10 ); int& i = c1.front(); const int& ii = c1.front(); cout
The first integer of c1 is 10 The first integer of c1 is 11 

get_allocator

Возвращает копию объекта объекта распределителя, использованного для создания списка.

Allocator get_allocator() const; 

Возвращаемое значение

Распределитель, используемый списком.

Замечания

Распределители для класса списка определяют, как это класс управляет хранилищем. Распределители по умолчанию для классов контейнеров из стандартной библиотеки C++ достаточны для большинства задач программирования. Написание и использование собственного класса распределителя требует расширенных навыков работы с C++.

Пример

// list_get_allocator.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; // The following lines declare objects // that use the default allocator. list c1; list  c2 = list ( allocator( ) ); // c3 will use the same allocator class as c1 list c3( c1.get_allocator( ) ); list::allocator_type xlst = c1.get_allocator( ); // You can now call functions on the allocator class used by c1 > 

insert

Вставляет элемент или количество элементов или диапазон элементов в указанное положение в списке.

iterator insert(iterator Where, const Type& Val); iterator insert(iterator Where, Type&& Val); void insert(iterator Where, size_type Count, const Type& Val); iterator insert(iterator Where, initializer_list IList); template void insert(iterator Where, InputIterator First, InputIterator Last); 

Параметры

Where
Положение в целевом списке, куда вставляется первый элемент.

Val
Значение элемента, вставляемого в список.

Count
Количество элементов, вставляемых в список.

First
Положение первого элемента в диапазоне элементов в копируемом списке аргументов.

Last
Положение первого элемента после диапазона элементов в копируемом списке аргументов.

Возвращаемое значение

Две первые функции вставки возвращают итератор, указывающий на положение вставки нового элемента в список.

Пример

// list_class_insert.cpp // compile with: /EHsc #include #include #include int main() < using namespace std; list c1, c2; list ::iterator Iter; c1.push_back(10); c1.push_back(20); c1.push_back(30); c2.push_back(40); c2.push_back(50); c2.push_back(60); cout c3; string str("a"); c3.insert(c3.begin(), move(str)); cout << "Moved first element: " << c3.front() << endl; // Assign with an initializer_list list c4 < >; c4.insert(c4.begin(), < 5, 6, 7, 8 >); cout

iterator

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

typedef implementation-defined iterator; 

Замечания

Тип iterator можно использовать для изменения значения элемента.

Пример

Пример см. в примере begin .

list

Создает список определенного размера, или с элементами определенного значения, или с определенным распределителем, или в качестве копии какого-либо другого списка или его части.

list(); explicit list(const Allocator& Al); explicit list(size_type Count); list(size_type Count, const Type& Val); list(size_type Count, const Type& Val, const Allocator& Al); list(const list& Right); list(list&& Right); list(initializer_list IList, const Allocator& Al); template list(InputIterator First, InputIterator Last); template list(InputIterator First, InputIterator Last, const Allocator& Al); 

Параметры

Al
Класс распределителя для использования с данным объектом.

Count
Количество элементов в создаваемом списке.

Val
Значение элементов в списке.

Right
Список, для которого создаваемый список станет копией.

First
Положение первого элемента в диапазоне копируемых элементов.

Last
Положение первого элемента после диапазона копируемых элементов.

IList
Список initializer_list с элементами, которые необходимо скопировать.

Замечания

Все конструкторы хранят объект распределителя ( Al ) и инициализировать список.

get_allocator возвращает копию объекта распределителя, используемого для создания списка.

Первые два конструктора указывают пустой начальный список, второй, указывающий тип распределителя ( Al ) для использования.

Третий конструктор задает повторение указанного числа ( Count ) элементов со значением по умолчанию для класса Type .

Четвертый и пятый конструкторы указывают повторение ( Count ) элементов значения Val .

Шестой конструктор задает копию списка Right .

Седьмой конструктор перемещает список Right .

Восьмой конструктор использует initializer_list, чтобы указать элементы.

Два следующих конструктора копируют диапазон [First, Last) списка.

Ни один из конструкторов не выполняет промежуточные перераспределения.

Пример

// list_class_list.cpp // compile with: /EHsc #include #include int main() < using namespace std; // Create an empty list c0 list c0; // Create a list c1 with 3 elements of default value 0 list c1(3); // Create a list c2 with 5 elements of value 2 list c2(5, 2); // Create a list c3 with 3 elements of value 1 and with the // allocator of list c2 list c3(3, 1, c2.get_allocator()); // Create a copy, list c4, of list c2 list c4(c2); // Create a list c5 by copying the range c4[ first, last) list ::iterator c4_Iter = c4.begin(); c4_Iter++; c4_Iter++; list c5(c4.begin(), c4_Iter); // Create a list c6 by copying the range c4[ first, last) and with // the allocator of list c2 c4_Iter = c4.begin(); c4_Iter++; c4_Iter++; c4_Iter++; list c6(c4.begin(), c4_Iter, c2.get_allocator()); cout << "c1 ="; for (auto c : c1) cout << " " << c; cout << endl; cout << "c2 ="; for (auto c : c2) cout << " " << c; cout << endl; cout << "c3 ="; for (auto c : c3) cout << " " << c; cout << endl; cout << "c4 ="; for (auto c : c4) cout << " " << c; cout << endl; cout << "c5 ="; for (auto c : c5) cout << " " << c; cout << endl; cout << "c6 ="; for (auto c : c6) cout << " " << c; cout << endl; // Move list c6 to list c7 list c7(move(c6)); cout << "c7 ="; for (auto c : c7) cout << " " << c; cout << endl; // Construct with initializer_list listc8(< 1, 2, 3, 4 >); cout
c1 = 0 0 0c2 = 2 2 2 2 2c3 = 1 1 1c4 = 2 2 2 2 2c5 = 2 2c6 = 2 2 2c7 = 2 2 2c8 = 1 2 3 4 

max_size

Возвращает максимальную длину списка.

size_type max_size() const; 

Возвращаемое значение

Максимально возможная длина списка.

Пример

// list_max_size.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; list c1; list ::size_type i; i = c1.max_size( ); cout

merge

Удаляет элементы из списка аргументов, вставляет их в список назначения и сортирует новый объединенный набор элементов по возрастанию или в ином указанном порядке.

void merge(list& right); template void merge(list& right, Traits comp); 

Параметры

right
Список аргументов для слияния со списком назначения.

comp
Оператор сравнения, использованный для упорядочения элементов списка назначения.

Замечания

Список аргументов right объединен со списком назначения.

И список аргументов, и список назначения должны быть упорядочены с использованием того же отношения сравнения, по которому должно быть упорядочена готовая последовательность. По умолчанию для первой функции-члена используется порядок по возрастанию. Вторая функция-член накладывает пользовательную операцию comp сравнения класса Traits .

Пример

// list_merge.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; list c1, c2, c3; list ::iterator c1_Iter, c2_Iter, c3_Iter; c1.push_back( 3 ); c1.push_back( 6 ); c2.push_back( 2 ); c2.push_back( 4 ); c3.push_back( 5 ); c3.push_back( 1 ); cout << "c1 ="; for ( c1_Iter = c1.begin( ); c1_Iter != c1.end( ); c1_Iter++ ) cout << " " << *c1_Iter; cout << endl; cout << "c2 ="; for ( c2_Iter = c2.begin( ); c2_Iter != c2.end( ); c2_Iter++ ) cout << " " << *c2_Iter; cout << endl; c2.merge( c1 ); // Merge c1 into c2 in (default) ascending order c2.sort( greater( ) ); cout : c2 ="; for ( c2_Iter = c2.begin( ); c2_Iter != c2.end( ); c2_Iter++ ) cout << " " << *c2_Iter; cout << endl; cout << "c3 ="; for ( c3_Iter = c3.begin( ); c3_Iter != c3.end( ); c3_Iter++ ) cout << " " << *c3_Iter; cout << endl; c2.merge( c3, greater( ) ); cout ' comparison relation: c2 ="; for ( c2_Iter = c2.begin( ); c2_Iter != c2.end( ); c2_Iter++ ) cout
c1 = 3 6 c2 = 2 4 After merging c1 with c2 and sorting with >: c2 = 6 4 3 2 c3 = 5 1 After merging c3 with c2 according to the '>' comparison relation: c2 = 6 5 4 3 2 1 

operator=

Заменяет элементы списка копией другого списка.

list& operator=(const list& right); list& operator=(list&& right); 

Параметры

right
Копируемый list в . list

Замечания

После удаления всех существующих элементов в list оператор копирует или перемещает содержимое right в list .

Пример

// list_operator_as.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; listv1, v2, v3; list::iterator iter; v1.push_back(10); v1.push_back(20); v1.push_back(30); v1.push_back(40); v1.push_back(50); cout << "v1 = " ; for (iter = v1.begin(); iter != v1.end(); iter++) cout << *iter << " "; cout << endl; v2 = v1; cout << "v2 = "; for (iter = v2.begin(); iter != v2.end(); iter++) cout << *iter << " "; cout << endl; // move v1 into v2 v2.clear(); v2 = forward< list>(v1); cout

pointer

Предоставляет указатель на элемент в списке.

typedef typename Allocator::pointer pointer; 

Замечания

Тип pointer можно использовать для изменения значения элемента.

В большинстве случаев iterator следует использовать для доступа к элементам в объекте списка.

pop_back

Удаляет элемент в конце списка.

void pop_back(); 

Замечания

Последний элемент не должен быть пустым. pop_back никогда не создает исключений.

Пример

// list_pop_back.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; list c1; c1.push_back( 1 ); c1.push_back( 2 ); cout
The first element is: 1 The last element is: 2 After deleting the element at the end of the list, the last element is: 1 

pop_front

Удаляет элемент в начале списка.

void pop_front(); 

Замечания

Первый элемент не должен быть пустым. pop_front никогда не создает исключений.

Пример

// list_pop_front.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; list c1; c1.push_back( 1 ); c1.push_back( 2 ); cout
The first element is: 1 The second element is: 2 After deleting the element at the beginning of the list, the first element is: 2 

push_back

Добавляет элемент в конец списка.

void push_back(const Type& val); void push_back(Type&& val); 

Параметры

val
Элемент, добавляемый в конец списка.

Замечания

При создании исключения список не изменяется, а исключение создается снова.

Пример

// list_push_back.cpp // compile with: /EHsc #include #include #include int main( ) < using namespace std; list c1; c1.push_back( 1 ); if ( c1.size( ) != 0 ) cout << "Last element: " << c1.back( ) << endl; c1.push_back( 2 ); if ( c1.size( ) != 0 ) cout << "New last element: " << c1.back( ) << endl; // move initialize a list of strings list c2; string str("a"); c2.push_back( move( str ) ); cout
Last element: 1 New last element: 2 Moved first element: a 

push_front

Добавляет элемент в начало списка.

void push_front(const Type& val); void push_front(Type&& val); 

Параметры

val
Элемент, добавляемый в начало списка.

Замечания

При создании исключения список не изменяется, а исключение создается снова.

Пример

// list_push_front.cpp // compile with: /EHsc #include #include #include int main( ) < using namespace std; list c1; c1.push_front( 1 ); if ( c1.size( ) != 0 ) cout << "First element: " << c1.front( ) << endl; c1.push_front( 2 ); if ( c1.size( ) != 0 ) cout << "New first element: " << c1.front( ) << endl; // move initialize a list of strings list c2; string str("a"); c2.push_front( move( str ) ); cout
First element: 1 New first element: 2 Moved first element: a 

rbegin

Возвращает итератор, который адресует первый элемент в обратном списке.

const_reverse_iterator rbegin() const; reverse_iterator rbegin(); 

Возвращаемое значение

Обратный двунаправленный итератор, адресующий первый элемент в обратном списке (или элемент, бывший последним в списке до изменения его порядка на обратный).

Замечания

rbegin используется с обратным списком так же, как begin и в списке.

Если возвращаемое значение rbegin назначается const_reverse_iterator , то объект списка невозможно изменить. Если возвращаемое значение rbegin назначается reverse_iterator , то объект списка изменить нельзя.

rbegin можно использовать для последовательного прохождения по списку в обратную сторону.

Пример

// list_rbegin.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; list c1; list ::iterator c1_Iter; list ::reverse_iterator c1_rIter; // If the following line replaced the line above, *c1_rIter = 40; // (below) would be an error //list ::const_reverse_iterator c1_rIter; c1.push_back( 10 ); c1.push_back( 20 ); c1.push_back( 30 ); c1_rIter = c1.rbegin( ); cout 
The last element in the list is 30. The list is: 10 20 30 The reversed list is: 30 20 10 The last element in the list is now 40. 

reference

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

typedef typename Allocator::reference reference; 

Пример

// list_ref.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; list c1; c1.push_back( 10 ); c1.push_back( 20 ); int &i = c1.front( ); int &j = c1.back( ); cout
The first element is 10 The second element is 20 

remove

Удаляет из списка элементы, совпадающие с заданным значением.

void remove(const Type& val); 

Параметры

val
Значение, которое должен иметь элемент для удаления этого элемента из списка.

Замечания

Порядок оставшихся элементов не изменяется.

Пример

// list_remove.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; list c1; list ::iterator c1_Iter, c2_Iter; c1.push_back( 5 ); c1.push_back( 100 ); c1.push_back( 5 ); c1.push_back( 200 ); c1.push_back( 5 ); c1.push_back( 300 ); cout << "The initial list is c1 ="; for ( c1_Iter = c1.begin( ); c1_Iter != c1.end( ); c1_Iter++ ) cout << " " << *c1_Iter; cout << endl; list c2 = c1; c2.remove( 5 ); cout
The initial list is c1 = 5 100 5 200 5 300 After removing elements with value 5, the list becomes c2 = 100 200 300 

remove_if

Удаляет из списка элементы, для которых выполняется заданный предикат.

template void remove_if(Predicate pred) 

Параметры

pred
Унарный предикат, который в случае совпадения с элементом приводит к удалению данного элемента из списка.

Пример

// list_remove_if.cpp // compile with: /EHsc #include #include template class is_odd : public std::unary_function  < public: bool operator( ) ( T& val ) < return ( val % 2 ) == 1; >>; int main( ) < using namespace std; list c1; list ::iterator c1_Iter, c2_Iter; c1.push_back( 3 ); c1.push_back( 4 ); c1.push_back( 5 ); c1.push_back( 6 ); c1.push_back( 7 ); c1.push_back( 8 ); cout << "The initial list is c1 ="; for ( c1_Iter = c1.begin( ); c1_Iter != c1.end( ); c1_Iter++ ) cout << " " << *c1_Iter; cout << endl; list c2 = c1; c2.remove_if( is_odd( ) ); cout
The initial list is c1 = 3 4 5 6 7 8 After removing the odd elements, the list becomes c2 = 4 6 8 

rend

Возвращает итератор, адресующий расположение после последнего элемента в обратном списке.

const_reverse_iterator rend() const; reverse_iterator rend(); 

Возвращаемое значение

Обратный двунаправленный итератор, адресующий расположение после последнего элемента в обратном списке (расположение перед первым элементом в списке до изменения его порядка на обратный).

Замечания

rend используется с обратным списком так же, как end и в списке.

Если возвращаемое значение rend назначается const_reverse_iterator , то объект списка невозможно изменить. Если возвращаемое значение rend назначается reverse_iterator , то объект списка изменить нельзя.

rend можно использовать для проверки, достиг ли итератор конца списка.

Значение, возвращаемое rend , не должно быть подвергнуто удалению ссылки.

Пример

// list_rend.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; list c1; list ::iterator c1_Iter; list ::reverse_iterator c1_rIter; // If the following line had replaced the line above, an error would // have resulted in the line modifying an element (commented below) // because the iterator would have been const // list ::const_reverse_iterator c1_rIter; c1.push_back( 10 ); c1.push_back( 20 ); c1.push_back( 30 ); c1_rIter = c1.rend( ); c1_rIter --; // Decrementing a reverse iterator moves it forward in // the list (to point to the first element here) cout 
The first element in the list is: 10 The list is: 10 20 30 The reversed list is: 30 20 10 The modified reversed list is: 30 20 40 

resize

Указывает новый размер списка.

void resize(size_type _Newsize); void resize(size_type _Newsize, Type val); 

Параметры

_Newsize
Новый размер списка.

val
Значение новых элементов для добавления в список, если новый размер больше исходного. Если значение не задано, новым элементам назначается значение по умолчанию для класса.

Замечания

Если размер списка меньше запрошенного размера, _Newsize , элементы добавляются в список, пока он не достигнет требуемого размера.

Если размер списка больше запрошенного размера, ближайшие к концу списка элементы удаляются, пока размер списка не станет равным _Newsize .

Если текущий размер списка совпадает с запрошенным, никакие действия не выполняются.

size отражает текущий размер списка.

Пример

// list_resize.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; list c1; c1.push_back( 10 ); c1.push_back( 20 ); c1.push_back( 30 ); c1.resize( 4,40 ); cout
The size of c1 is 4 The value of the last element is 40 The size of c1 is now 5 The value of the last element is now 0 The reduced size of c1 is: 2 The value of the last element is now 20 

reverse

Изменяет порядок следования элементов в списке на обратный.

void reverse(); 

Пример

// list_reverse.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; list c1; list ::iterator c1_Iter; c1.push_back( 10 ); c1.push_back( 20 ); c1.push_back( 30 ); cout
c1 = 10 20 30 Reversed c1 = 30 20 10 

reverse_iterator

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

typedef std::reverse_iterator reverse_iterator; 

Замечания

Тип reverse_iterator используется для последовательного прохождения через список в обратную сторону.

Пример

Пример см. в примере rbegin .

size

Возвращает количество элементов в списке.

size_type size() const; 

Возвращаемое значение

Текущая длина списка.

Пример

// list_size.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; list c1; list ::size_type i; c1.push_back( 5 ); i = c1.size( ); cout
List length is 1. List length is now 2. 

size_type

Тип, считающий количество элементов в списке.

typedef typename Allocator::size_type size_type; 

Пример

Пример см. в примере size .

sort

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

void sort(); template void sort(Traits comp); 

Параметры

comp
Оператор сравнения, использованный для упорядочивания последовательных элементов.

Замечания

Первая функция-член по умолчанию помещает элементы в порядке возрастания.

Функция шаблона-члена упорядочивает элементы в соответствии с операцией сравнения comp , указанной пользователем класса Traits .

Пример

// list_sort.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; list c1; list ::iterator c1_Iter; c1.push_back( 20 ); c1.push_back( 10 ); c1.push_back( 30 ); cout << "Before sorting: c1 ="; for ( c1_Iter = c1.begin( ); c1_Iter != c1.end( ); c1_Iter++ ) cout << " " << *c1_Iter; cout << endl; c1.sort( ); cout << "After sorting c1 ="; for ( c1_Iter = c1.begin( ); c1_Iter != c1.end( ); c1_Iter++ ) cout << " " << *c1_Iter; cout << endl; c1.sort( greater( ) ); cout
Before sorting: c1 = 20 10 30 After sorting c1 = 10 20 30 After sorting with 'greater than' operation, c1 = 30 20 10 

splice

Удаляет элементы из исходного списка и вставляет их в целевой список.

// insert the entire source list void splice(const_iterator Where, list& Source); void splice(const_iterator Where, list&& Source); // insert one element of the source list void splice(const_iterator Where, list& Source, const_iterator Iter); void splice(const_iterator Where, list&& Source, const_iterator Iter); // insert a range of elements from the source list void splice(const_iterator Where, list& Source, const_iterator First, const_iterator Last); void splice(const_iterator Where, list&& Source, const_iterator First, const_iterator Last); 

Параметры

Where
Позиция в целевом списке, после которого будут вставлены элементы.

Source
Исходный список, который необходимо вставить в целевой список.

Iter
Элемент, который будет вставлен из исходного списка.

First
Первый элемент в диапазоне, который будет вставлен из исходного списка.

Last
Первая позиция за пределами диапазона, в которой будут вставлены элементы из исходного списка.

Замечания

Первая пара функций-членов вставляет все элементы исходного списка в целевой список перед позицией, указанной Where , и удаляет все элементы из исходного списка. (Значение &Source не должно быть равно this .)

Вторая пара функций-членов вставляет элемент, на который ссылается Iter позиция в списке назначения, на которую ссылается Where Итер из исходного списка. (Если Where == Iter || Where == ++Iter , изменения не происходят.)

Третья пара функций-членов вставляет диапазон, обозначенный [ First , Last ), перед элементом в целевом списке, указанном Where , и удаляет этот диапазон элементов из исходного списка. (Если &Source == this , диапазон [First, Last) не должен содержать элемент, на который указывает Where .)

Если диапазон splice вставляет N элементы и &Source != this объект класса iterator увеличивается N .

Во всех случаях итераторы, указатели и ссылки, указывающие на соединенные элементы, остаются действительными и переносятся в целевой контейнер.

Пример

// list_splice.cpp // compile with: /EHsc /W4 #include #include using namespace std; template void print(const S& s) < cout cout int main() < listc1; list c2; list c3; list c4; list::iterator where_iter; list::iterator first_iter; list::iterator last_iter; cout 
Beginning state of lists:c1 = 2 elements: (10) (11)c2 = 3 elements: (20) (21) (22)c3 = 2 elements: (30) (31)c4 = 4 elements: (40) (41) (42) (43)After splicing c1 into c2:c1 = 0 elements:c2 = 5 elements: (20) (10) (11) (21) (22)After splicing the first element of c3 into c2:c3 = 1 elements: (31)c2 = 6 elements: (20) (10) (11) (30) (21) (22)After splicing a range of c4 into c2:c4 = 2 elements: (40) (43)c2 = 8 elements: (20) (10) (11) (30) (41) (42) (21) (22) 

swap

Меняет местами элементы двух списков.

void swap(list& right); friend void swap(list& left, list& right) 

Параметры

right
Список, предоставляющий элементы для обмена местами, или список, элементы которого должны быть заменены на элементы списка left .

left
Список, элементы которого должны быть заменены на элементы списка right .

Пример

// list_swap.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; list c1, c2, c3; list ::iterator c1_Iter; c1.push_back( 1 ); c1.push_back( 2 ); c1.push_back( 3 ); c2.push_back( 10 ); c2.push_back( 20 ); c3.push_back( 100 ); cout
The original list c1 is: 1 2 3 After swapping with c2, list c1 is: 10 20 After swapping with c3, list c1 is: 100 

unique

Удаляет из списка повторяющиеся соседние элементы или соседние элементы, удовлетворяющие условию какого-либо другого двоичного предиката.

void unique(); template void unique(BinaryPredicate pred); 

Параметры

pred
Двоичный предикат, используемый для сравнения последовательных элементов.

Замечания

Эта функция исходит из того, что список упорядочен, поэтому все повторяющиеся элементы находятся рядом друг с другом. Повторяющиеся элементы, находящиеся не рядом друг с другом, не будут удалены.

Первая функция-член удаляет каждый элемент, равный предшествующему элементу.

Вторая функция-член удаляет каждый элемент, удовлетворяющий функции предиката pred при сравнении с предшествующим элементом. Вы можете использовать любой из двоичных объектов функции, объявленных в заголовке аргумента pred , или создать собственные объекты.

Пример

// list_unique.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; list c1; list ::iterator c1_Iter, c2_Iter,c3_Iter; not_equal_to mypred; c1.push_back( -10 ); c1.push_back( 10 ); c1.push_back( 10 ); c1.push_back( 20 ); c1.push_back( 20 ); c1.push_back( -10 ); cout << "The initial list is c1 ="; for ( c1_Iter = c1.begin( ); c1_Iter != c1.end( ); c1_Iter++ ) cout << " " << *c1_Iter; cout << endl; list c2 = c1; c2.unique( ); cout << "After removing successive duplicate elements, c2 ="; for ( c2_Iter = c2.begin( ); c2_Iter != c2.end( ); c2_Iter++ ) cout << " " << *c2_Iter; cout << endl; list c3 = c2; c3.unique( mypred ); cout
The initial list is c1 = -10 10 10 20 20 -10 After removing successive duplicate elements, c2 = -10 10 20 -10 After removing successive unequal elements, c3 = -10 -10 

value_type

Тип, представляющий тип данных, хранящихся в списке.

typedef typename Allocator::value_type value_type; 

Замечания

value_type является синонимом для параметра-шаблона Type .

Пример

// list_value_type.cpp // compile with: /EHsc #include #include int main( ) < using namespace std; list::value_type AnInt; AnInt = 44; cout

Что такое List в C#?

Динамические массивы или коллекции - хороши тем, что нам не надо указывать сколько в них будет элементов. Кроме того, мы можем с легкостью удалять элементы, добавлять новые и выполнять полное удаление всех элементов. Программам обычно необходимо выделять больше памяти на такие массивы.

Списки (List) в языке C# представляют собой динамически расширяемые коллекции, спроектированные для хранения и управления набором элементов. Они предоставляют удобные методы для добавления, удаления и доступа к элементам коллекции.

Для создания динамического массива необходимо подключить специальную библиотеку, которая отвечает за это.

using System.Collections.Generic;

После этого мы можем их использовать. Изначально такие массивы создаются без каких-либо элементов в них, так как потом их можно добавить при помощи метода Add .

List words = new List (); words.Add ("Простые слова,"); words.Add ("но они являются"); words.Add ("элементами массива"); // Вывод элементов списка foreach (int item in myList) Console.WriteLine(item);

Как использовать библиотеку list в с

Нет ограничений на тип, который можно поместить в список.

Создание списка с начальными значениями

Доступ к элементам списка

Длина списка

Для определения длины списка используется свойство Count .

Получение длины списка

Перебор списка

Для перебора списка можно использовать классический цикл, например for .

Перебор списка for

Также существует специальный цикл для работы со списками foreach .

Перебор списка foreach

Методы списка

Наконец, добрались до самого интересного — методы, которые улучшают работу со списком по сравнении с массивом. Рассмотрим следующие методы (полный список методов можно посмотреть в документации Microsoft):

Добавление в список

  • void Add(T item) — добавляет новый элемент с типом T в конец списка.
  • void AddRange(IEnumerable collection) — добавляет в список коллекцию или массив в конец списка.
  • void Insert(int index, T item) — вставляет элемент в коллекцию по указанному индексу. При выходе за границы коллекции (0 > index или Count-1 < index) будет сформировано исключение System.ArgumentOutOfRangeException .
  • void InsertRange(int index, IEnumerable collection) — аналогично методу выше, только вставляет список элементов по указанному индексу. Также при выходе за границы будет сформировано исключение System.ArgumentOutOfRangeException .

Поиск и проверка элемента

  • int BinarySearch(T item) — бинарный поиск элемента в списке, возвращает индекс элемента. Работает корректно, если список отсортирован. Имеет еще два варианта реализации с дополнительными параметрами для корректного сравнения элементов или указания начальной точки поиска.
  • bool Contains(T item) — проверка наличия элемента в списке.
  • bool Exists(Predicate match) — проверяет наличие в списке хотя бы одного элемента удовлетворяющего условиям делегата match .
  • T Find(Predicate match) — возвращает первый элемент, удовлетворяющий условиям делегата match .
  • List FindAll(Predicate match) — аналогичен Find , только возвращает все элементы.
  • int FindIndex(Predicate match) — возвращает первый индекс элемента, удовлетворяющего условиям делегата match . Имеет еще два варианта реализации с указанием позиции поиска и количества элементов.
  • int FindLastIndex(Predicate match) — аналогично FindIndex , только возвращает индекс последнего элемента, удовлетворяющего условиям делегата match . Также имеет еще два варианта реализации с указанием позиции поиска и количества элементов.
  • List GetRange(int index, int count) — этот метод получает подсписок из списка от указанного индекса с указанным количеством элементов.
  • int IndexOf(T item) — возвращает первый индекс элемента, если он найден в списке либо -1 . Также имеет еще два реализации с указанием позиции поиска и количества элементов.
  • int LastIndexOf(T item) — возвращает последний индекс элемента, если он найден в списке либо -1 . Также имеет еще два реализации с указанием позиции поиска и количества элементов.

Удаление из списка

  • bool Remove(T item) — удаляет первое вхождение указанного элемента из списка. Возвращает true , если элемент был удален или false , если нет.
  • int RemoveAll(Predicate match) — удаляет все элементы, удовлетворяющие условиям делегата match . Возвращает количество удаленных элементов.
  • void RemoveAt(int index) — удаляет элемент списка с указанным индексом. При выходе индекса за границы списка формирует исключение System.ArgumentOutOfRangeException .
  • void RemoveRange(int index, int count) — удаляет элементы массива с указанного индекса в указанном количестве. Если index меньше 0 или значение параметра count меньше 0, то будет сформировано исключение System.ArgumentOutOfRangeException . Если параметры index и count не указывают допустимый диапазон элементов в списке, будет сформировано исключение System.ArgumentException .
  • void Clear() — удаляет все элементы из списка.

Сортировка списка

  • void Sort() — сортирует элементы. В основе лежит алгоритм быстрой сортировки с ограничением глубины рекурсии до 32, при достижении которого используется сортировка кучей.
  • void Reverse() — изменяет порядок элементов во всем списке на обратный. Имеет перегруженную версию, в которой указывается начальный индекс и количество элементов.

Прочее

  • List ConvertAll(Converter converter) — позволяет сконвертировать все типы элементов текущего списка в другой тип. На входе принимает делегат на метод, преобразующий объект от одного типа к другому.
  • void CopyTo(T[] array) — копирует список в массив. Имеет еще 2 варианта реализации с указанием границ и позиций копирования.
  • void ForEach(Action action) — это аналог цикла foreach , только в качестве итерации будет выполняться метод, который на входе принимает элемент с типом T . Еще одно отличие такого цикла от foreach состоит в том, что в методе не сработает ни break , ни continue . Аналогом continue при таком подходе можно считать return .
  • T[] ToArray() — возвращает массив элементов списка.

Примеры

Добавление в список

В этом примере мы создадим массив и разными способами заполним его в цикле.

Удаление данных из списка

Поиск и проверка элемента

Работа с диапазоном

Расположение элементов в обратном порядке

Построение элементов в обратном порядке

В статье рассмотрена работа с коллекцией List , рассмотрена базовая работа (инициализация, обращение к данными) и методы для работы со списком:

  1. Добавление.
  2. Поиск.
  3. Удаление.
  4. Сортировка.
  5. Работа с диапазонами.

Материалы по теме

  • ��‍��️ Самоучитель по C#: абстрактные классы и члены классов
  • ��‍��️ Учебник по C#: работа с коллекциями Dictionary
  • �� Руководство по С# для начинающих: массивы и цикл foreach

C++ реализация класса List, метод insert

Реализую класс List, возникли проблемы с методом Insert. Данный метод работает также как и в библиотеки list, т.е. я передаю в функцию позицию куда вставить и само значение, при этом размер списка не увеличивается, он просто заменяет значение элемента на заданной позиции. В самое начало и в конец все правильно вставляет, а с остальным проблемы.

void insert(const int index, const T& value) < Element* newelem = new Element(value); int curindex = 0; Element* cur = _front; while (cur != nullptr) < if (index == 0) < //если введен index=0, при помощи конструктора я изменяю значения // первого элемента _front=new Element(value,_front->GetNext(),_front->GetPrev()); > if (index == _size-1) < //если введен index=size(размеру моего списка), при помощи //конструктора я изменяю значения последнего элемента _back = new Element(value, _back->GetNext(), _back->GetPrev()); > if (index < 0) < return; >if (curindex == index-1) < //SetNext()-метод который указывает на следующий элемент //SetЗкум()-метод который указывает на предыдущий элемент newelem->SetNext(cur->GetNext()); newelem->SetPrev(cur->GetPrev()); cur->SetNext(newelem); > curindex++; cur = cur->GetNext(); > > 

Как данный метод более правильно реализовать?

Отслеживать

Smile_mask

задан 21 окт 2020 в 12:07

Smile_mask Smile_mask

423 4 4 серебряных знака 12 12 бронзовых знаков

Я тут пишу программу, но почему-то неверно работает вызов z = x*allowUser()-5 , не подскажете, почему? Не имея никакой информации ни о x , ни об allowUser() и даже об операторе * ? Вопросы с просьбами помочь с отладкой («почему этот код не работает?») должны включать желаемое поведение, конкретную проблему или ошибку и минимальный код для её воспроизведения прямо в вопросе. Вопросы без явного описания проблемы бесполезны для остальных посетителей.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *