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

Как удалить элемент из массива структур с

  • автор:

Array. Clear Метод

Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Перегрузки

Очищает содержимое массива.

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

Clear(Array)

Очищает содержимое массива.

public: static void Clear(Array ^ array);
public static void Clear (Array array);
static member Clear : Array -> unit
Public Shared Sub Clear (array As Array)
Параметры

Массив, из которого необходимо удалить элементы.

Исключения

array имеет значение null .

Применяется к

Clear(Array, Int32, Int32)

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

public: static void Clear(Array ^ array, int index, int length);
public static void Clear (Array array, int index, int length);
static member Clear : Array * int * int -> unit
Public Shared Sub Clear (array As Array, index As Integer, length As Integer)
Параметры

Массив, элементы которого необходимо очистить.

Начальный индекс диапазона элементов, которые необходимо очистить.

Число элементов, подлежащих очистке.

Исключения

array имеет значение null .

index меньше нижней границы массива array .

Значение параметра length меньше нуля.

Сумма index и length больше, чем размер array .

Примеры

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

using System; class Example < public static void Main() < Console.WriteLine("One dimension (Rank=1):"); int[] numbers1 = < 1, 2, 3, 4, 5, 6, 7, 8, 9 >; for (int i = 0; i < 9; i++) < Console.Write("", numbers1[i]); > Console.WriteLine(); Console.WriteLine(); Console.WriteLine("Array.Clear(numbers1, 2, 5)"); Array.Clear(numbers1, 2, 5); for (int i = 0; i < 9; i++) < Console.Write("", numbers1[i]); > Console.WriteLine(); Console.WriteLine(); Console.WriteLine("Two dimensions (Rank=2):"); int[,] numbers2 = < < 1, 2, 3 >, < 4, 5, 6 >, < 7, 8, 9 >>; for (int i = 0; i < 3; i++) < for (int j = 0; j < 3; j++) < Console.Write("", numbers2[i, j]); > Console.WriteLine(); > Console.WriteLine(); Console.WriteLine("Array.Clear(numbers2, 2, 5)"); Array.Clear(numbers2, 2, 5); for (int i = 0; i < 3; i++) < for (int j = 0; j < 3; j++) < Console.Write("", numbers2[i, j]); > Console.WriteLine(); > Console.WriteLine("Three dimensions (Rank=3):"); int[, ,] numbers3 = , >, , >, , >>; for (int i = 0; i < 2; i++) < for (int j = 0; j < 2; j++) < for (int k = 0; k < 2; k++) < Console.Write("", numbers3[i, j, k]); > Console.WriteLine(); > Console.WriteLine(); > Console.WriteLine("Array.Clear(numbers3, 2, 5)"); Array.Clear(numbers3, 2, 5); for (int i = 0; i < 2; i++) < for (int j = 0; j < 2; j++) < for (int k = 0; k < 2; k++) < Console.Write("", numbers3[i, j, k]); > Console.WriteLine(); > Console.WriteLine(); > > > /* This code example produces the following output: * * One dimension (Rank=1): * 1 2 3 4 5 6 7 8 9 * * Array.Clear(numbers1, 2, 5) * 1 2 0 0 0 0 0 8 9 * * Two dimensions (Rank=2): * 1 2 3 * 4 5 6 * 7 8 9 * * Array.Clear(numbers2, 2, 5) * 1 2 0 * 0 0 0 * 0 8 9 * * Three dimensions (Rank=3): * 1 2 * 3 4 * * 5 6 * 7 8 * * Array.Clear(numbers3, 2, 5) * 1 2 * 0 0 * * 0 0 * 0 8 */ 
open System printfn "One dimension (Rank=1):" let numbers1 = [| 1..9 |] for i in numbers1 do printf $" " printfn "\n\nArray.Clear(numbers1, 2, 5)" Array.Clear(numbers1, 2, 5) for i in numbers1 do printf $" " printfn "\n\nTwo dimensions (Rank=2):" let numbers2 = array2D [ [ 1; 2; 3 ]; [ 4; 5; 6 ]; [ 7; 8; 9 ] ] for i = 0 to 2 do for j = 0 to 2 do printfn $" " printfn "" printfn "\nArray.Clear(numbers2, 2, 5)" Array.Clear(numbers2, 2, 5) for i = 0 to 2 do for j = 0 to 2 do printfn $" " printfn "" printfn "Three dimensions (Rank=3):" let numbers3 = Array3D.zeroCreate 2 2 2 numbers3[0, 0, 0] " printfn "" printfn "" printfn "Array.Clear(numbers3, 2, 5)" Array.Clear(numbers3, 2, 5) for i = 0 to 1 do for j = 0 to 1 do for k = 0 to 1 do printf $" " printfn "" printfn "" // This code example produces the following output: // // One dimension (Rank=1): // 1 2 3 4 5 6 7 8 9 // // Array.Clear(numbers1, 2, 5) // 1 2 0 0 0 0 0 8 9 // // Two dimensions (Rank=2): // 1 2 3 // 4 5 6 // 7 8 9 // // Array.Clear(numbers2, 2, 5) // 1 2 0 // 0 0 0 // 0 8 9 // // Three dimensions (Rank=3): // 1 2 // 3 4 // // 5 6 // 7 8 // // Array.Clear(numbers3, 2, 5) // 1 2 // 0 0 // // 0 0 // 0 8 // 
Module Example Sub Main() Console.WriteLine(vbLf & "One dimension (Rank=1):") Dim numbers1() As Integer = For i As Integer = 0 To 8 Console.Write(" ", numbers1(i)) Next Console.WriteLine() Console.WriteLine(vbLf & "Array.Clear(numbers1, 2, 5)") Array.Clear(numbers1, 2, 5) For i As Integer = 0 To 8 Console.Write(" ", numbers1(i)) Next Console.WriteLine() Console.WriteLine(vbLf & "Two dimensions (Rank=2):") Dim numbers2(,) As Integer = , < 4, 5, 6 >, < 7, 8, 9 >> For i As Integer = 0 To 2 For j As Integer = 0 To 2 Console.Write(" ", numbers2(i, j)) Next Console.WriteLine() Next Console.WriteLine(vbLf & "Array.Clear(numbers2, 2, 5)") Array.Clear(numbers2, 2, 5) For i As Integer = 0 To 2 For j As Integer = 0 To 2 Console.Write(" ", numbers2(i, j)) Next Console.WriteLine() Next Console.WriteLine(vbLf & "Three dimensions (Rank=3):") Dim numbers3(,,) As Integer = , < 3, 4 >>, _ , < 7, 8 >>, _ , < 11, 12 >>> For i As Integer = 0 To 1 For j As Integer = 0 To 1 For k As Integer = 0 To 1 Console.Write(" ", numbers3(i, j, k)) Next Console.WriteLine() Next Console.WriteLine() Next Console.WriteLine() Console.WriteLine("Array.Clear(numbers3, 2, 5)") Array.Clear(numbers3, 2, 5) For i As Integer = 0 To 1 For j As Integer = 0 To 1 For k As Integer = 0 To 1 Console.Write(" ", numbers3(i, j, k)) Next Console.WriteLine() Next Console.WriteLine() Next End Sub End Module ' The example displays the following output: ' One dimension (Rank=1): ' 1 2 3 4 5 6 7 8 9 ' ' Array.Clear(numbers1, 2, 5) ' 1 2 0 0 0 0 0 8 9 ' ' Two dimensions (Rank=2): ' 1 2 3 ' 4 5 6 ' 7 8 9 ' ' Array.Clear(numbers2, 2, 5) ' 1 2 0 ' 0 0 0 ' 0 8 9 ' ' Three dimensions (Rank=3): ' 1 2 ' 3 4 ' ' 5 6 ' 7 8 ' ' Array.Clear(numbers3, 2, 5) ' 1 2 ' 0 0 ' ' 0 0 ' 0 8 

В следующем примере определяется TimeZoneTime структура, которая включает TimeZoneInfo поле и DateTimeOffset поле. Затем он вызывает метод для очистки Clear одного элемента в двухэлейном массиве значений TimeZoneTime . Метод задает значение очищенного элемента в значение TimeZoneInfo по умолчанию объекта , которое равно null , и значение DateTimeOffset по умолчанию объекта , которое равно DateTimeOffset.MinValue.

using System; public struct TimeZoneTime < private DateTimeOffset dt; private TimeZoneInfo tz; public TimeZoneTime(DateTimeOffset dateTime, TimeZoneInfo timeZone) < dt = dateTime; tz = timeZone; >public DateTimeOffset DateTime < get < return dt; >> public TimeZoneInfo TimeZone < get < return tz; >> > public class Example < public static void Main() < // Declare an array with two elements. TimeZoneTime[] timeZoneTimes = < new TimeZoneTime(DateTime.Now, TimeZoneInfo.Local), new TimeZoneTime(DateTime.Now, TimeZoneInfo.Utc) >; foreach (var timeZoneTime in timeZoneTimes) Console.WriteLine(": ", timeZoneTime.TimeZone == null ? "" : timeZoneTime.TimeZone.ToString(), timeZoneTime.DateTime); Console.WriteLine(); Array.Clear(timeZoneTimes, 1, 1); foreach (var timeZoneTime in timeZoneTimes) Console.WriteLine(": ", timeZoneTime.TimeZone == null ? "" : timeZoneTime.TimeZone.ToString(), timeZoneTime.DateTime); > > // The example displays the following output: // (UTC-08:00) Pacific Time (US & Canada): 1/20/2014 12:11:00 PM // UTC: 1/20/2014 12:11:00 PM // // (UTC-08:00) Pacific Time (US & Canada): 1/20/2014 12:11:00 PM // : 1/1/0001 12:00:00 AM 
open System [] type TimeZoneTime = < DateTime: DateTimeOffset TimeZone: TimeZoneInfo >// Declare an array with two elements. let timeZoneTimes = [| < DateTime = DateTimeOffset.Now; TimeZone = TimeZoneInfo.Local > < DateTime = DateTimeOffset.Now; TimeZone = TimeZoneInfo.Local >|] for timeZoneTime in timeZoneTimes do let tz = if isNull timeZoneTime.TimeZone then "" else string timeZoneTime.TimeZone printfn $": " printfn "" Array.Clear(timeZoneTimes, 1, 1) for timeZoneTime in timeZoneTimes do let tz = if isNull timeZoneTime.TimeZone then "" else string timeZoneTime.TimeZone printfn $": " // The example displays the following output: // (UTC-08:00) Pacific Time (US & Canada): 1/20/2014 12:11:00 PM // UTC: 1/20/2014 12:11:00 PM // // (UTC-08:00) Pacific Time (US & Canada): 1/20/2014 12:11:00 PM // : 1/1/0001 12:00:00 AM 
Public Structure TimeZoneTime Private dt As DateTimeOffset Private tz As TimeZoneInfo Public Sub New(dateTime As DateTimeOffset, timeZone As TimeZoneInfo) dt = dateTime tz = timeZone End Sub Public ReadOnly Property DateTime As DateTimeOffset Get Return dt End Get End Property Public ReadOnly Property TimeZone As TimeZoneInfo Get Return tz End Get End Property End Structure Module Example Public Sub Main() ' Declare an array with two elements. Dim timeZoneTimes() As TimeZoneTime = < New TimeZoneTime(Date.Now, TimeZoneInfo.Local), New TimeZoneTime(Date.Now, TimeZoneInfo.Utc) >For Each timeZoneTime In timeZoneTimes Console.WriteLine(": ", If(timeZoneTime.TimeZone Is Nothing, "", timeZoneTime.TimeZone), timeZoneTime.DateTime) Next Console.WriteLine() Array.Clear(timeZoneTimes, 1, 1) For Each timeZoneTime In timeZoneTimes Console.WriteLine(": ", If(timeZoneTime.TimeZone Is Nothing, "", timeZoneTime.TimeZone), timeZoneTime.DateTime) Next End Sub End Module ' The example displays output like the following: ' (UTC-08:00) Pacific Time (US & Canada): 1/20/2014 12:11:00 PM ' UTC: 1/20/2014 12:11:00 PM ' ' (UTC-08:00) Pacific Time (US & Canada): 1/20/2014 12:11:00 PM ' : 1/1/0001 12:00:00 AM 

Комментарии

Этот метод сбрасывает каждый элемент в массиве до значения по умолчанию типа элемента. Он задает для элементов ссылочных типов (включая String элементы) null значение , а для элементов типов значений — значения по умолчанию, показанные в следующей таблице.

Тип Значение
Boolean false
Все целочисленные и числовые типы с плавающей запятой 0 (ноль)
DateTime DateTime.MinValue
Другие типы значений Значение по умолчанию для полей типа

Диапазон очищенных элементов, перенося их из строки в строку в многомерном массиве.

Этот метод очищает только значения элементов; сами элементы не удаляются. Массив имеет фиксированный размер; поэтому элементы нельзя добавлять или удалять.

Этот метод является операцией O( n ), где n — . length

Удаление n-ого элемента структуры c#

Вот структура которая состоит из имени и возраста человека. Как из нее удалить n-ый элемент и вывести структуру уже без него? Или можно только создать новую структуру и скопировать в нее все кроме n элемента?

public struct mans < public string name; public int age; public mans(string _name, int _age) : this() < this.name = _name; this.age = _age; >> static void Main(string[] args) < Listman = new List(); int m = 4; for(int i=0; i); man.Add(new mans(wrMan[0], Convert.ToInt32(wrMan[1]))); > for(int i=0; i int n=Convert.ToInt32(Console.ReadLine()); > 

Отслеживать
задан 20 фев 2022 в 16:59
131 9 9 бронзовых знаков

А при чем тут вообще структура? И почему из нее удалить , если у вас не в структуре данные, а в простой коллекции. mans у вас ведь «один человек», а не список. Берите значит и удаляйте man.RemoveAt(0) или man.Remove(объект) . Достаточно ведь поставить точку и посмотреть какие есть методы, либо нажать на тип и прожать клавишу F1 на клавиатуре, вам сразу откроется документация по нему, со всеми методами и описанием.

20 фев 2022 в 17:06

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Все смешалось. кони. люди.

  • Структура — это данные об одном человеке, так? Почему вы назвали этот тип mans ? Ведь в переводе на русский было бы mans — это «люди», но нет такого слово в английском, есть people «люди» и men — «мужики». Если имеется в виду человек, персона, то и назовите тип Person . В C# типы — структуры и классы называют с большой буквы.

Структура будет выглядеть так.

public struct Person < public string name; public int age; public Person(string _name, int _age) < name = _name; age = _age; >> 
  • List man — список типа «мужики» вы называете «мужик», даже если не учитывать трудности перевода, все должно быть наоборот. Назовите persons .
  • Convert.ToString(Console.ReadLine()); преобразование string в string , это как закрашивать синее пятно синей ручкой в тетради. Совершенно бесполезно. Не втыкайте в код преобразования без причны.
  • Взаимодействуйте с пользователем, пишите ему, что надо делать. В противном случае можете сами же запутаться, забыв, на каком этапе сейчас выполнение кода.
  • Разбивайте код на методы. Вам ведь нужно вывести элементы, затем удалить из списка элемент и затем посмотреть изменения, так? Чтобы не писать один и тот же код дважды, создайте метод.
static void Main(string[] args) < Console.Write("Сколько всего элементов: "); int count = int.Parse(Console.ReadLine()); Listpersons = new List(); for (int i = 0; i < count; i++) < Console.Write($"Введите элемент []: "); string input = Console.ReadLine(); string[] tokens = input.Split(); persons.Add(new Person(tokens[0], int.Parse(tokens[1]))); > Console.WriteLine(); PrintPersons(persons); Console.Write($"Индекс элемента для удаления (от 0 до ): "); int n = int.Parse(Console.ReadLine()); persons.RemoveAt(n); Console.WriteLine(); PrintPersons(persons); > private static void PrintPersons(List persons) < Console.WriteLine($"Всего элементов: "); for (int i = 0; i < persons.Count; i++) < Console.WriteLine($""); > Console.WriteLine(); > 

Так код легче читается?

Вывод в консоль

Сколько всего элементов: 3 Введите элемент [0]: Вася 10 Введите элемент [1]: Федя 12 Введите элемент [2]: Настя 28 Всего элементов: 3 Вася 10 Федя 12 Настя 28 Индекс элемента для удаления (от 0 до 2): 1 Всего элементов: 2 Вася 10 Настя 28 

Как удалить элемент из массива структур в C++?

Однако мне нужно иметь возможность пройти по массиву и удалить определенный элемент. У меня отсортированная часть цикла. Но как удалить элемент из массива структур? c++ data-structures linked-list delete-operator

Поделиться Источник 02 мая 2010 в 08:37

5 ответов

То, что вы показали, это не массив struct , а связанный список struct , содержащий массивы (типа char ). Массив struct будет выглядеть так:

str_pair array_of_structs[10]; // or: str_pair* dynamically_allocated_array_of_structs = new str_pair[10]; 

Если у вас есть что-то вроде этого, вам не нужно удалять отдельные элементы из массива. Допустим, вы инициализировали свой массив следующим образом:

str_pair* array_of_structs = new str_pair[10]; 

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

delete[] array_of_structs; 

Опять же, вы не можете удалять отдельные элементы в массиве, выделенном с помощью new[] ; вы выполняете delete[] на весь массив. Если, с другой стороны, вы намеревались сказать «связанный список struct «,», то обычно удаляете элемент, подобно следующему:

str_pair* previous_item = . ; str_pair* item_to_delete = previous_item->next; if (item_to_delete != 0) < previous_item->next = item_to_delete->next; // make the list "skip" one item delete item_to_delete; // and delete the skipped item > 

Или, на английском: Найдите элемент (A), предшествующий элементу, который вы хотите удалить (B), затем настройте указатель «следующий» A так, чтобы B был пропущен в списке, а затем удалите B. Вам нужно быть осторожным с специальными случаями, т.е. когда элемент, который нужно удалить из списка, является первым или последним. Вышеуказанный код недостаточен, когда вы хотите удалить первый элемент в списке, потому что не будет previous_item . В этом случае вам нужно будет изменить указатель на первый элемент списка на второй.

Ваш код:

void deleteitem(char *uri) < str_pair *itemtodelete; curr = head; while (curr->next != NULL) < if ((strcmp(curr->uri, uri)) == 0) < itemtodelete = curr; curr = itemtodelete->next; delete itemtodelete; curr = head; return; > curr = curr->next; > > 
  • Если head равен null, тест curr->next!= NULL вызовет отступ по умолчанию. (Вы никогда не должны обращать внимание на указатель null!)
  • Ваш код для удаления элемента из списка совершенно неправильный. Хуже всего, вы удаляете узел без изменения следующего указателя предыдущего элемента. Таким образом, предыдущий элемент будет ссылаться на элемент, который больше не существует.
  • Детали: curr = head; перед оператором return не делает ничего полезного.

Предложенный код:

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

str_pair* finditemwithuri(char* uri) < str_pair* current = head; while (current) < if (strcmp(current->uri, uri) == 0) return current; current = current->next; > return 0; > void deleteitem(char* uri) < // find linked list node with that uri; abort if uri not in list str_pair* itemtodelete = finditemwithuri(uri); if (!itemtodelete) return; // special case: node to be deleted is the list's head if (itemtodelete == head) < head = itemtodelete->next; delete itemtodelete; return; > // else, iterate over list nodes // up to the one preceding the node to be deleted str_pair* current = head; while (current) < if (itemtodelete == current->next) < current->next = itemtodelete->next; delete itemtodelete; return; > current = current->next; > > 

Поделиться 02 мая 2010 в 08:44

Просто используйте std::list. Нет причины вручную писать такую конструкцию.

std::list предлагает удалить.

Поделиться 02 мая 2010 в 16:44

Вы можете удалить его, используя обычное ключевое слово удаления, но это не изменит всех остальных членов массива. Если вы хотите такого поведения, посмотрите на std::vector или что-то вроде этого.

Поделиться 02 мая 2010 в 08:43

Как указали другие, это связанный список, а не массив. Чтобы ответить на ваш вопрос о связанных списках:

Чтобы вставить элемент:

str_pair* p = // iterate over the linked list to your insertion point str_pair* item = new str_pair; item->next = p->next; p->next = item; 

Это вставляет новый str_pair после p.

Чтобы удалить элемент:

str_pair* p = // iterate to just before your deletion point str_pair* item = p->next; p->next = p->next->next; delete item; 

Это удалит элемент после p

Чтобы сделать это с вашим кодом:

void deleteitem(char *uri) < str_pair *previous = NULL; curr = head; while (curr != NULL) < if ((strcmp(curr->uri, uri)) == 0) < // modify the previous element to skip over our deleted one if (previous) previous->next = curr->next; else head = curr->next; // safely delete the element, now that no one points to it delete curr; curr = head; return; > // always remember our previous element, so we can fix its 'next' pointer previous = curr; curr = curr->next; > > 

Вам также нужен лучший метод добавления:

void additem(char *uri, char *ip) < curr = head; // traverse the list until we're at the last item while (curr->next != NULL) < curr = curr->next; > // attach a new element to the list curr->next = new str_pair; // go to that new element curr = curr->next; // set the values of the new element strcpy(curr->ip, ip); strcpy(curr->uri, uri); curr->next = NULL; curr = head; > 

Поделиться 02 мая 2010 в 08:54

Возможно, это не тема, но почему бы вам не использовать библиотеку std::list ?

Удаление структуры из массива структур

Author24 — интернет-сервис помощи студентам

Удаление динамической структуры структур
Здравствуйте! Есть две структуры: struct TRow < int m; double *elem; >; struct.

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

Удаление структур из массива
нужна функция, которая бы удаляла нужный элемент массива структур, но я совершенно не имею.

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

Эксперт С++

1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167

что вы подразумеваете под удалением? и для того, что бы понять как удалить, нужно видеть как создаёте. в общем инфы мало, давайте весь код, так будет проще.

Регистрация: 02.12.2012
Сообщений: 35

ЦитатаСообщение от l_a_m Посмотреть сообщение

давайте весь код, так будет проще.
Весь код слишком длинный, написал маленький пример..
А это разве не заполнение?
Под удалением подразумевается удаление структуры под опр. номером. Допустим WORKER[6]

Эксперт С++

1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
что такое WORKER и как он создаётся?

ЦитатаСообщение от Ghoster Посмотреть сообщение

удаление структуры под опр. номером
без сдвига данных на удаленную область?
Регистрация: 02.12.2012
Сообщений: 35

ЦитатаСообщение от l_a_m Посмотреть сообщение

что такое WORKER и как он создаётся?
Worker это и есть структура, создающаяся в первой (точнее 2) строчке.

ЦитатаСообщение от l_a_m Посмотреть сообщение

без сдвига данных на удаленную область?
Можно и без сдвига, т.к. данные заносятся в файл, откуда потом считываются по порядку

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
#include typedef struct { std::string s1; std::string s2; std::string s3; } col; const size_t size = 3; int main() { setlocale(LC_ALL, "Russian"); col *arr = new col[size]; for (int i = 0; i  size; i++) { std::getline(std::cin, arr[i].s1); std::getline(std::cin, arr[i].s2); std::getline(std::cin, arr[i].s3); } int number; std::cout  <"Какую уструктуру удалить?"; std::cin >> number; for (int i = 0; i  size; i++) { if (i != number)std::cout  [i].s1  <' '  [i].s2  <' '  [i].s3  ::endl; } return 0; }
Меню пользователя @ Belfegor

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

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