Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Mesteriis
373 / 156 / 40
Регистрация: 08.08.2015
Сообщений: 1,107
Завершенные тесты: 1
#1

Интересная особенность в работе вектора - C++

10.11.2015, 00:42. Просмотров 455. Ответов 22
Метки нет (Все метки)

Доброе время суток!

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

Значит так:
Заполняем вектор элементами (имена файлов прочитанные из директории) Вектор имеет структуру:
Имя файла (строка)
Расширение (строка)
Путь (строка)
Номер (Инт)
Дальше циклом читаем этот вектор с условием что если тип расширение равен (например) dmg (маковский exe) то скопировать его в другой вектор! а элемент в первоначальном удалить!

Но по какой то неведомой причине условия пропускает несколько элементов которые она должна отработать!
Не могу найти причину такого поведения, у кого какие мысли?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.11.2015, 00:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Интересная особенность в работе вектора (C++):

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

Особенность объявления функции - C++
Собсно вопрос такой , зачем нужно объявлять функции если их можно просто определять? связано ли это с компилятором?

В чем особенность функции типа void от других типов? - C++
В чем особенность функции типа void от других типов?

Найти сколько элементов первого вектора совпадают с элементами второго вектора - C++
#include <iostream> #include <time.h> #include <vector> #include <set> using namespace std; void main() { ...

Дан список, элементы которого являются координатами вектора. Найти длину вектора - C++
1. Дан список, элементы которого являются координатами вектора в n-мерном пространстве. Найти длину вектора.

Определить количество положительных элементов вектора С(10) и заменить этим значением минимальный элемент вектора А(5) - C++
Ребята помогите пожалуйста с задачкой. Я сам не шарю в C++, но в этом семестре появился этот предмет! И завтра его надо будет сдать :( Буду...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
10.11.2015, 11:30 #16
Цитата Сообщение от pproger Посмотреть сообщение
при каждом удалении (изменения размера вектора) может происходить перевыделение памяти
При удалении такого не происходит. Собственно из-за этого и добавили shrink_to_fit
Цитата Сообщение от pproger Посмотреть сообщение
я бы использовал стандартный алгоритм remove_if
А я бы std::remove_copy_if
pproger
164 / 67 / 13
Регистрация: 22.03.2011
Сообщений: 196
10.11.2015, 11:36 #17
Цитата Сообщение от gru74ik Посмотреть сообщение
1) std::vector - контейнер, который может содержать элементы одного типа (а не коллекцию разных)
а что, в крестах бывают гетерогенные контейнеры?
Цитата Сообщение от gru74ik Посмотреть сообщение
после удаления элемента с ... помощью remove_if() используй метод shrink_to_fit()
ничо не даст.

Добавлено через 3 минуты
Цитата Сообщение от Tulosba Посмотреть сообщение
А я бы std::remove_copy_if
он модифицирует удаленные элементы. а не просто копирует.

Цитата Сообщение от Tulosba Посмотреть сообщение
При удалении такого не происходит
есть мнение, что это implementation defined
gru74ik
Модератор
Эксперт CЭксперт С++
4150 / 1776 / 197
Регистрация: 20.02.2013
Сообщений: 4,898
Записей в блоге: 21
10.11.2015, 11:39 #18
Цитата Сообщение от pproger Посмотреть сообщение
ничо не даст.
Размер и ёмкость будет совпадать, по крайней мере.

Добавлено через 3 минуты
А как вообще можно бороться с тем, что итераторы становятся невалидными? Есть какие-то способы решить эту проблему (ну кроме как заранее место резервировать с помощью reserve() )?
pproger
164 / 67 / 13
Регистрация: 22.03.2011
Сообщений: 196
10.11.2015, 11:45 #19
Цитата Сообщение от gru74ik Посмотреть сообщение
Размер и ёмкость будет совпадать, по крайней мере.
это может быть и минусом. аллокатор старается, понимаешь ли, с запасом выделяет память для будущих элементов, а тут нна, и вся работа на смарку. вобщем, вредный совет на мой взгляд.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
10.11.2015, 12:05 #20
Цитата Сообщение от pproger Посмотреть сообщение
он модифицирует удаленные элементы. а не просто копирует.
С remove_copy_if я, конечно, погорячился. Однако элементы он не модифицирует:
Copies the elements in the range [first,last) to the range beginning at result, except those elements for which pred returns true.
Для условного переноса элементов из одного контейнера в другой нужно что-то такого вида:
C++
1
2
3
4
5
std::vector<int> v;
// ...
auto it = std::stable_partition(v.begin(), v.end(), pick_the_good_elements);
std::vector<int> w(std::make_move_iter(it), std::make_move_iter(v.end()));
v.erase(it, v.end());
Отсюда. Там же есть и другое решение.
Цитата Сообщение от pproger Посмотреть сообщение
есть мнение, что это implementation defined
Ошибочное мнение. 23.3.6.5/3:
Invalidates iterators and references at or after the point of the erase.
Т.о. до точки удаления итераторы и ссылки не портятся. Стало быть перевыделения быть не может.

Добавлено через 1 минуту
Цитата Сообщение от gru74ik Посмотреть сообщение
бороться с тем, что итераторы становятся невалидными?
Не допускать соответствующих действий.
Насчет инвалидации много полезного тут.
pproger
164 / 67 / 13
Регистрация: 22.03.2011
Сообщений: 196
10.11.2015, 12:12 #21
Tulosba, под модификацией элементов я имел ввиду автора, а не алгоритм
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
10.11.2015, 12:26 #22
Цитата Сообщение от pproger Посмотреть сообщение
под модификацией элементов я имел ввиду автора, а не алгоритм
Странно.
Цитата Сообщение от Mesteriis Посмотреть сообщение
то скопировать его в другой вектор! а элемент в первоначальном удалить!
Ну, возможно что-то изменилось с исходной постановки.
Mesteriis
373 / 156 / 40
Регистрация: 08.08.2015
Сообщений: 1,107
Завершенные тесты: 1
10.11.2015, 12:35  [ТС] #23
Не ссорьтесь, Реши проблему по другому, при переборе вектора не удалял элемент а меня его ключ (было в моей структуре такое поле), с false на true! А в самом конце когда все элементы были true удалял весь вектор! pproger, был прав когда я в цикле удалял элемент после его копирования (допустим 3й), то следующий элемент который отвечал моим условиям уже был не 7й, а 7-1=6й и так далее, а shrink_to_fit нечего бы не дал, так как изначально я не резервировал память под вектор, потому что не знал какой емкости он будет. Да и ужатие его тоже не принесет не какого смысла! (Ну я про данную ситуацию)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.11.2015, 12:35
Привет! Вот еще темы с ответами:

Ошибка с итераторами для целочисленного вектора и вектора структуры - C++
Пытаюсь разобраться с векторами. Для динамической работы с памятью вещь, вроде, замечательная и удобная. Только необходимо использовать...

Заданный вектор А, состоящий из n элементов. Переставить компоненты вектора, размещенные после самого элемента вектора А - C++
Заданный вектор А, состоящий из n элементов. Переставить компоненты вектора, размещенные после самого элемента вектора А на начало, а...

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

Составить главную программу и функцию. Для данного вектора А(М) найти количество неповторяющихся элементов вектора - C++
Здравствуйте. Буду очень благодарен,если кто нибудь напишет два кода к этим задачам. Спасибо за внимание. Задача 1. Составить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.11.2015, 12:35
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru