2013-11-19 2 views
0

Извините заранее за то, что у вас нет полного набора деталей, но я столкнулся с этим дома и теперь на работе. Также я новичок в STL, поэтому я уверен, что мой синтаксис где-то не прав.Сброс сердечника при создании вектора из диапазона векторов

Я пытаюсь изменить код визуализации субтитров omxplayer на перенос слов. Ввод представляет собой вектор типов InternalChar, где InternalChar является частной структурой typedef в классе, который я модифицирую. Код выполняет итерацию с помощью вектора поиска слов. Код выглядит так:

"input" имеет тип std :: vector. "output" - вектор таких векторов.

auto start=input.begin() 

... мы тогда не (в данном конкретном случае) ввести цикл, который находит слово точку обруча, создает вектор из диапазона в «входе» и обновление «начать» соответственно ...

output[count] = std::vector<InternalChar>(start, input.end()) 

EDIT

Я думаю, что вполне может быть, используя следующую вместо выше:

output.push_back(std::vector<InternalChar>(start, input.end())); 

END EDIT

GDB сообщает мне, что авария происходит на этой последней строке, глубоко внутри STL в какой-либо «своп-функции» или что-то в этом роде. Моя первая мысль заключалась в том, что мне нужно было использовать «input.end() - 1» в качестве конца диапазона, но это тоже происходит одинаково одинаково.

Мне также было интересно, есть ли проблема в том, что у InternalChar нет оператора присваивания, но это простая структура с членом bool и элементом char32_t, поэтому C++ может решить, как копировать из одного вектора в новый создал один.

Любая помощь будет очень признательна.

+5

Множество возможных причин, мое первое предположение было бы за пределами доступа к «выходному» вектору. То есть count - < 0 or > = output.size(). – john

+1

Я предполагаю, что 'output [count]' не выделен. Вероятно, вызов 'swap' выполняется во время назначения, поскольку rhs является временным. Либо «выход» должен быть создан с нужным размером, либо вам нужно использовать 'output.push_back' для добавления к вектору и его автоматического роста. Но без кода, который просто догадывается. –

+0

@Adam Думая об этом, я думаю, что использовал push_back, а не индексированный доступ. Но вдруг я не уверен. И я не предварительно выделил какую-либо память, так что это возможно. – AlastairG

ответ

0

Кредит Адам и Берри (в меньшей степени, так как он сказал, размер(), а не мощности()) к Джону:

код использовал [] доступ и ранее не имели какой-либо память, выделенная для него. Переход на использование push_back(), который я изначально планировал, но на самом деле не реализовал.

0

Итераторы в векторе могут стать недействительными, если вы добавите или удалите элементы, поскольку вектор может решить перераспределить. Поэтому, если вы храните input.begin() в некоторой переменной, а позже решите его использовать, возможно, что он больше недействителен.

+0

Я не изменяю «ввод», так что это не моя проблема. Но полезная информация в любом случае, спасибо! – AlastairG

Смежные вопросы