Как получить итератор на элемент vector

Обновлено: 30.06.2024

Если я определяю вектор STL, по значению а не указателю,
вот так:

то если у меня есть итератор на элемент какой-то,
то как из него взять значение переменной ?

т.е.
получается только так:
через преобразование в указатель:


можно как-то без перобразований обойтись?

Не надо таких кошмарных преобразований.

Of course, the code must be complete enough to compile and link.

Да.
Не всегда догадливость работает.

У вектора итератор все равно указатель.

Здравствуйте, vgrigor, Вы писали:

V>У вектора итератор все равно указатель.
1)Не факт.
2)Для других итераторов также можно получить значение. Вернее ссылку.

ЗЫ STL итераторы спроектированы так чтобы максимально походить на указатели.
ЗЗЫ Везде где нужны итераторы можно использовать указатели но не везде где нужны указатели можно использовать итераторы.

Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
От: jazzer Skype: enerjazzer
Дата: 16.02.04 13:12
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Не надо таких кошмарных преобразований.

L_L>

Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, vgrigor, Вы писали:

V>>У вектора итератор все равно указатель.
WH>1)Не факт.
WH>2)Для других итераторов также можно получить значение. Вернее ссылку.

WH>ЗЫ STL итераторы спроектированы так чтобы максимально походить на указатели.
WH>ЗЗЫ Везде где нужны итераторы можно использовать указатели но не везде где нужны указатели можно использовать итераторы.

Пример приведите, где итератор — ссылка?

От: jazzer Skype: enerjazzer
Дата: 16.02.04 13:23
Оценка:

Здравствуйте, vgrigor, Вы писали:

V>Здравствуйте, WolfHound, Вы писали:

WH>>Здравствуйте, vgrigor, Вы писали:

V>>>У вектора итератор все равно указатель.
WH>>1)Не факт.
WH>>2)Для других итераторов также можно получить значение. Вернее ссылку.

WH>>ЗЫ STL итераторы спроектированы так чтобы максимально походить на указатели.
WH>>ЗЗЫ Везде где нужны итераторы можно использовать указатели но не везде где нужны указатели можно использовать итераторы.

V>Спасибо,

V>Пример приведите, где итератор — ссылка?

имеется в виду, что выражение *iterator есть ссылка на объект, на который сейчас указывает iterator.

V>>Пример приведите, где итератор — ссылка?

J>имеется в виду, что выражение *iterator есть ссылка на объект, на который сейчас указывает iterator.

т.е. побитового копирования, или просто .= не происходит ??

Здравствуйте, vgrigor, Вы писали:

АШ>>

v> У вектора итератор все равно указатель.

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

Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен

Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Здравствуйте, vgrigor, Вы писали:

АШ>>>

v>> У вектора итератор все равно указатель.

ПК>Не обязательно. В данном случае это, вообще, не существенно: если итератор
ПК>реализован классом, у него должна быть перегружена операция *.

А у STL вектора он как реализован ?
Чего у него за оператор *?

А почему не просто указатель на тип по шаблону?
У нас же шаблоны по поределенному типу,
или смысл есть какой-то в дополнительном приведении типов
при этой операции?

V>А почему не просто указатель на тип по шаблону?
V>У нас же шаблоны по поределенному типу,
V>или смысл есть какой-то в дополнительном приведении типов
V>при этой операции?

Когда я изучал экзамены Мелкософта, 70-015,
то я удивлялся совершенно четкой роли и большой роли догадливоти,
в ответа на экзаменационные вопросы.

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

Здравствуйте, vgrigor, Вы писали:

V>А у STL вектора он как реализован ?
V>Чего у него за оператор *?
Например в STL Port (в дебуг версии) итераторы проверяют выход за границу массива.
V>А почему не просто указатель на тип по шаблону?
В релизе как правило (для std::vector) так и есть. Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн Здравствуйте, vgrigor, Вы писали:

V>т.е. побитового копирования,
Что такое побитовое копирование? В С++ нет такого понятия.
Есть конструктор копирования и копирующие присваивание. И то и другое может содержать кучу дополнительных действий.
В данном случае ни какого копирования не происходит. Мало того что оно не нужно дык оно еще и испортит синематику итераторов.
V>или просто .= не происходит ??
А это что за оператор? Из какого языка? В С++ есть = но не .= Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн

Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, vgrigor, Вы писали:

V>>А у STL вектора он как реализован ?
V>>Чего у него за оператор *?
WH>Например в STL Port (в дебуг версии) итераторы проверяют выход за границу массива.
V>>А почему не просто указатель на тип по шаблону?
WH>В релизе как правило (для std::vector) так и есть.


Если итератор это готовый результат, то зачем ему смотреть не вышел ли он еще за пределы?

Есть заполненный вектор

с помощью std:max_element я могу получить ссылку (итератор) на максимальный элемент этого вектора. А как мне теперь определить индекс этого максимального элемента в векторе?

Здравствуйте, Daimond, Вы писали:

D>Есть заполненный вектор

D>

D>с помощью std:max_element я могу получить ссылку (итератор) на максимальный элемент этого вектора. А как мне теперь определить индекс этого максимального элемента в векторе?

Здравствуйте, Daimond, Вы писали:

D>с помощью std:max_element я могу получить ссылку (итератор) на максимальный элемент этого вектора. А как мне теперь определить индекс этого максимального элемента в векторе?

Здравствуйте, Daimond, Вы писали:

D>Есть заполненный вектор

D>

D>с помощью std:max_element я могу получить ссылку (итератор) на максимальный элемент этого вектора. А как мне теперь определить индекс этого максимального элемента в векторе?

Здравствуйте, Glоbus, Вы писали:

G>Здравствуйте, Daimond, Вы писали:

D>>Есть заполненный вектор

D>>

D>>с помощью std:max_element я могу получить ссылку (итератор) на максимальный элемент этого вектора. А как мне теперь определить индекс этого максимального элемента в векторе?

G>наверное так

G>

Здравствуйте, Pushkin_С, Вы писали:

То есть distance это да.. но чем в данном случае плоха разность итераторов по ветктору?

Здравствуйте, Glоbus, Вы писали:

G>Здравствуйте, Pushkin_С, Вы писали:

G>То есть distance это да.. но чем в данном случае плоха разность итераторов по ветктору?


можна и так.
Даже наверно нужно так!

Здравствуйте, Glоbus, Вы писали:

G>Здравствуйте, Pushkin_С, Вы писали:

G>То есть distance это да.. но чем в данном случае плоха разность итераторов по ветктору?


Нет гарантии, что итератор вектора будет указателем.

Вроде Scott Meyers писал, что в некоторых дебаг-версиях STL итераторы векторов — объекты.

Здравствуйте, Daimond, Вы писали:

D>Есть заполненный вектор

D>

D>с помощью std:max_element я могу получить ссылку (итератор) на максимальный элемент этого вектора. А как мне теперь определить индекс этого максимального элемента в векторе?

А не проще воспользоваться функцией size()?

Здравствуйте, Glоbus, Вы писали:

G>Здравствуйте, Pushkin_С, Вы писали:

G>То есть distance это да.. но чем в данном случае плоха разность итераторов по ветктору?

std::distance более универсален, когда ты допустим поменяешь std::vector на std::map этот кусок кода переписываться не будет. а для std::vector он один фиг превратится в разность, так что за универсальностью std::distance никаких тормозов не скрывается.

Здравствуйте, nobody2, Вы писали:

N>Здравствуйте, Glоbus, Вы писали:

G>>Здравствуйте, Pushkin_С, Вы писали:

G>>То есть distance это да.. но чем в данном случае плоха разность итераторов по ветктору?

N>Нет гарантии, что итератор вектора будет указателем.

N>Вроде Scott Meyers писал, что в некоторых дебаг-версиях STL итераторы векторов — объекты.

абажите.
насколько я понимаю, итераторы по ветктору — они и так объекты. просто хранят в себе указатели на элементы ветора. но это не важно. вопрос в том, переопределен ли для класса этого класса итератора operator -.

Здравствуйте, _AK_, Вы писали:

_AK>std::distance более универсален, когда ты допустим поменяешь std::vector на std::map этот кусок кода переписываться не будет. а для std::vector он один фиг превратится в разность, так что за универсальностью std::distance никаких тормозов не скрывается.

Да, эт понятно,ты конечно прав насчети универсальности, но в разность он похоже не всегда превратиться (по крайней мере в вижах 7.1 я спецификации шаблона для итератора по вектору не нашел)
вот примерец по быстродействию


по крайней мере у меня с distance получилось медленне в 2.5 раза.
хотя конечно по большому счету разница в скорости там мизерная и ощукщается только на вот таких вот примерах по десяткам лимонов итераций.

Здравствуйте, SWW, Вы писали:

SWW>Здравствуйте, Daimond, Вы писали:

D>>Есть заполненный вектор

D>>

D>>с помощью std:max_element я могу получить ссылку (итератор) на максимальный элемент этого вектора. А как мне теперь определить индекс этого максимального элемента в векторе?

SWW>А не проще воспользоваться функцией size()?

vector::size?
И каков будет результат?

Здравствуйте, nobody2, Вы писали:

N>Нет гарантии, что итератор вектора будет указателем.
А это фигня.
N>Вроде Scott Meyers писал, что в некоторых дебаг-версиях STL итераторы векторов — объекты.
И что? У вектора итрераторы произвольного доступа -> должны поддерживать оператор -. Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн

Здравствуйте, Glоbus, Вы писали:

G>по крайней мере у меня с distance получилось медленне в 2.5 раза.
У меня такое чуство что ты оптимизацию не включал.


как видишь асмовый листинг идентичен.

Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн

D>>>с помощью std:max_element я могу получить ссылку (итератор) на максимальный элемент этого вектора. А как мне теперь определить индекс этого максимального элемента в векторе?

SWW>>А не проще воспользоваться функцией size()?

G>vector::size?
G>И каков будет результат?

А, черт, максимальный элемент. Я почему-то подумал — максимальный индекс. В отпуск пора.

Здравствуйте, WolfHound, Вы писали:

WH>И что? У вектора итрераторы произвольного доступа -> должны поддерживать оператор -.

Да, 24.1.5 четко говорит об этом, но для остальных типов итераторов operator — стандарт не требует, поэтому использование выражения it1 — it2 для определения рассотяния между ними чревато ошибками при замене типа контейнера.

Здравствуйте, WolfHound, Вы писали:

WH>как видишь асмовый листинг идентичен.

да, вполне может быть

Здравствуйте, _AK_, Вы писали:

_AK>Здравствуйте, Glоbus, Вы писали:

G>>Здравствуйте, Pushkin_С, Вы писали:

G>>То есть distance это да.. но чем в данном случае плоха разность итераторов по ветктору?

_AK>std::distance более универсален, когда ты допустим поменяешь std::vector на std::map этот кусок кода переписываться не будет. а для std::vector он один фиг превратится в разность, так что за универсальностью std::distance никаких тормозов не скрывается.

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

Здравствуйте, Glоbus, Вы писали:
Да, эт понятно,ты конечно прав насчети универсальности, но в разность он похоже не всегда превратиться (по крайней мере в вижах 7.1 я спецификации шаблона для итератора по вектору не нашел)

— должна быть не спецификация для вектора, а для итератора произвольного доступа, коим и является итератор вектора.
Вот из VC 6 код:


З.Ы: это выдержка из файла <utility>

G>>>То есть distance это да.. но чем в данном случае плоха разность итераторов по ветктору?

_AK>>std::distance более универсален, когда ты допустим поменяешь std::vector на std::map этот
_AK>>кусок кода переписываться не будет. а для std::vector он один фиг превратится в
_AK>>разность, так что за универсальностью std::distance никаких тормозов не скрывается.

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

На мой взляд, это еще одна иллюстрация, что простая замена контейнера невозможна и часто замена контейнера ведет к изменению алгоритма.
О чём, кстати, неоднократно писалось и говорилось.

Ш> Люди перестают думать, чего они делают.

К сожалению, СТЛ не учит думать и скрывает многие детали. Учиться думать необходимо где-то пораньше (к вопросу о высшем образовании и иже с ним)

Здравствуйте, _AK_, Вы писали:

_AK>Здравствуйте, Glоbus, Вы писали:

G>>Здравствуйте, Pushkin_С, Вы писали:

G>>То есть distance это да.. но чем в данном случае плоха разность итераторов по ветктору?

_AK>std::distance более универсален, когда ты допустим поменяешь std::vector на std::map этот кусок кода переписываться не будет. а для std::vector он один фиг превратится в разность, так что за универсальностью std::distance никаких тормозов не скрывается.

STL позволяет ясно выражать ваши действия.
Для быстрых операций, таких как разность итераторов произовольного доступа или индексация вектора или map'а оператором [], используется простой синтаксис.
Если же операция медленная, необходимо явно указывать, что Вы её используете, например std::distance или std::find.
Поэтому разность итераторов есть только для произовольного доступа.
Если используется std::vector, то нужно просто писать -.
Это, согласно дизайну STL, говорит о том, что это быстрая операция.
Если, например, могут использоваться произовльные последовательности, то запись std::distance озночает, что автор явно соглашается, что для некоторых последовательностей может потребоваться линейное время.

Написать функцию для класса, возращающую данный из вектора обьектов класса по итератору вектора
День=добрый как написать функцию для класса возращающую данный из вектора обьектов класса по.

std::vector доступ по индексу vs доступ по итератору
std::vector&lt;int&gt; tmp; int i = 0; tmp.resize(1000000); std::vector&lt;int&gt;::iterator it.


Как получить доступ к элементу вектора решения (solve)
Мне нужно дальше использовать результат решения системы уравнений а как обратиться к конкретному.

Спасибо, но компилятору это все равно не нравится, выдает:
ошибка: no match for 'operator==' (operand types are 'std::basic_string<char>' and 'int')
if(*it == 0)
^ oooooowl, ну так у Вас же в векторе объекты типа string, как их сравнивать с числами? Компилятор этого не знает. Да, я с этим разобралась, но все еще не понимаю, как мне работать с индексами. Ведь итератор должен проходить по значениям индексов, а получается, что он проходит по значениям элементов.
Подскажите, пожалуйста, как сделать так, чтобы он проходил по значению именно индексов. Если через итератор такое реализовать нельзя, то через что можно? Ведь итератор должен проходить по значениям индексов, а получается, что он проходит по значениям элементов. Подскажите, пожалуйста, как сделать так, чтобы он проходил по значению именно индексов. Подскажите, пожалуйста, как сделать так, чтобы он проходил по значению именно индексов.

Извините, может я не так формулирую, но, вот что я примерно пытаюсь сказать:
Насколько я понимаю из-за того, что мы разименовываем итератор, он в цикле проходит по самим значениям элемента вектора. Как сделать так, чтобы мы имели доступ не к значениям, а к самим индексам, то есть не к "а" и "b", а к 0 и 1?

Я пытаюсь сделать по-другому, компилятор собирает программу, но ничего не пишет в консоли:

Добавлено через 1 минуту
nord_v, спасибо, хоть что-то стало понятнее Как сделать так, чтобы мы имели доступ не к значениям, а к самим индексам, то есть не к "а" и "b", а к 0 и 1? В данном случае это random-access итератор, поэтому индекс можно получить так:

То есть не использовать итераторы, а использовать простой проход через цикл for ?
Я пыталась сделать проще, но компилятор выдает ошибку
" no matching function for call to 'std::basic_string<char> :: push_back(__gnu_cxx::__alloc_traits<std::allocator<std::basi c_string<char> > >::value_type&)'
str2.push_back(str1[i]);"
^

Решение

nord_v, да, примерно так, теперь буду дальше работать со строкой str2
спасибо!

Добавлено через 2 минуты
Croessmah, пыталась два элемента из вектора str1 (впоследствии будет больше, чем два элемента) поместить в строку str2, чтобы затем в вектор str1 поместить в конец эту самую строку str2

Добавлено через 12 минут
nord_v, подскажите, почему, когда мы задаем дополнительное условие, компилятор собирает программу, но не выводит результат

почему, когда мы задаем дополнительное условие, компилятор собирает программу, но не выводит результат if((*it)[i] == 0)// это для примера, индекс будет впоследствии равен не 0, а переменной извне

Здесь же не индекс сравнивается с 0 (сравнение индекса будет так: if (i == 0)). Разыменование указателя возвращает элемент вектора, т.е. строку. Взятие индекса строки возвращает элемент этой строки, т.е. символ (код символа). Этот символ (его код) у тебя и сравнивается с 0. Нулю равен код символа '\0'. Условие, для твоих строк в векторе, не выполняется, в строку str2 ничего не помещается.

Добавлено через 4 минуты
Опиши ещё раз задачу, желательно с примерами.

Нам необходим вектор, в котором мы будем хранить все данные, а именно:
0 a/c
1 HB/a
2 b/c
3 AH/b
4 a^2
5 c*HB
6 b^2
7 c*AH
8 a^2 + b^2
9 c*(HB+AH)
10 c^2

также у нас есть те самые равенства "что-то = чему-то", то есть:
0 = 1
2 = 3
4 = 5
6 = 7
8 = 9
9 = 10

ну и в конце есть правило, которое выдает нам заветное "а^2 + b^2 = c^2", а именно:
IF 8 = 9 THEN 8 = 10

Итак, возвращаясь к вектору: чтобы связи "что-то = чему-то" заработали, нам необходимо написать функцию, в которую бы подавался вектор, в которой был бы цикл, проходящий по каждому элементу вектора и если бы он по индексу находил бы два нужных элемента, то в первоначальный вектор он бы пушил новый элемент, а именно - полученное равенство, то есть примерно так:

Ну и далее так происходит со всеми связями и затем уже включается правило if-then

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

Также, если у Вас есть предложения по улучшенной реализации (например, я хотела создавать векторы "024689" и "1357910", и потом уже их сравнивать и т.д.), то можем обсудить это уже не в данной теме, только скажите, как с Вами связаться.

Не получается использовать итераторы вектора в качестве итераторов своего класса
Пишу класс матрицы, основанный на векторе. Хочу его сделать stl-совместимым. Т.к. класс основан на.


C++: итераторы по умолчанию, пустые итераторы, end()
Всем добра! Вопрос на тему итераторов в плюсах: 1. какие значения имеют итераторы без.


Итераторы и обратные итераторы
У вектора есть два типа итераторов, обычные и обратные итераторы произвольного доступа. Обычные.

Итераторы
Как указать не на следующий за последним элемент последовательности, а на последний! end() -.

Читайте также: