Имеется вектор, забитый указателями на объект одного класса. В одной из функции я хочу вернуть указатель на 7-й элемент этого вектора, в вызывающую функцию и уже в ней обращаться с помощью адресной арифметики к элементам (указателям) вектора, расположенным за 7-м элементом. Возможно ли такое? Если бы был просто массив указателей — arr[200], я бы вернул arr, и уже работал бы так arr + 8... arr + 9 . Спасибо
Здравствуйте, Аноним, Вы писали:
А>Имеется вектор, забитый указателями на объект одного класса. В одной из функции я хочу вернуть указатель на 7-й элемент этого вектора, в вызывающую функцию и уже в ней обращаться с помощью адресной арифметики к элементам (указателям) вектора, расположенным за 7-м элементом. Возможно ли такое? Если бы был просто массив указателей — arr[200], я бы вернул arr, и уже работал бы так arr + 8... arr + 9 . Спасибо
возможно.
vector как раз и задумывался как замена обычному массиву.
только зачем извращаться так?
передавай итератор.
Re[2]: std::vector
От:
Аноним
Дата:
15.09.04 09:01
Оценка:
Здравствуйте, korzhik, Вы писали:
K>Здравствуйте, Аноним, Вы писали:
А>>Имеется вектор, забитый указателями на объект одного класса. В одной из функции я хочу вернуть указатель на 7-й элемент этого вектора, в вызывающую функцию и уже в ней обращаться с помощью адресной арифметики к элементам (указателям) вектора, расположенным за 7-м элементом. Возможно ли такое? Если бы был просто массив указателей — arr[200], я бы вернул arr, и уже работал бы так arr + 8... arr + 9 . Спасибо
K>возможно. K>vector как раз и задумывался как замена обычному массиву.
K>только зачем извращаться так? K>передавай итератор.
В смысле я могу сделать так: vectorObj + 7, а если двумерный, да еще невыровненный???
Здравствуйте, Аноним, Вы писали:
K>>возможно. K>>vector как раз и задумывался как замена обычному массиву.
K>>только зачем извращаться так? K>>передавай итератор.
А>В смысле я могу сделать так: vectorObj + 7, а если двумерный, да еще невыровненный???
ну ты даёшь! задаёшь вопрос про одно, а потом оказывается что уже всё изменилось.
во первых что такое vectorObj?
ну ладно ругаться больше не буду, а лучше достану свой хрустальный шар и немного потелепатирую...
а вот теперь вижу, что vectorObj это std::vector<MyClass*> vectorObj
Теперь отвечаю: вот так vectorObj + 7 делать нельзя, можно так:
Здравствуйте, Аноним, Вы писали:
А>Имеется вектор, забитый указателями на объект одного класса. В одной из функции я хочу вернуть указатель на 7-й элемент этого вектора, в вызывающую функцию и уже в ней обращаться с помощью адресной арифметики к элементам (указателям) вектора, расположенным за 7-м элементом. Возможно ли такое? Если бы был просто массив указателей — arr[200], я бы вернул arr, и уже работал бы так arr + 8... arr + 9 . Спасибо
std::vector хранит свои элементы в непрерывном блоке памяти. Адрес первого элемента можно получить так:
std::vector<int> arr;
...
int* ptr = &arr[0];
или
int* ptr = &arr.front();
или
int* ptr = &(*arr.begin());
ptr[i] = ...;
Любите книгу — источник знаний (с) М.Горький
Re[4]: std::vector
От:
Аноним
Дата:
15.09.04 09:37
Оценка:
Здравствуйте, korzhik, Вы писали:
K>Здравствуйте, Аноним, Вы писали:
K>>>возможно. K>>>vector как раз и задумывался как замена обычному массиву.
K>>>только зачем извращаться так? K>>>передавай итератор.
А>>В смысле я могу сделать так: vectorObj + 7, а если двумерный, да еще невыровненный???
K>ну ты даёшь! задаёшь вопрос про одно, а потом оказывается что уже всё изменилось.
K>во первых что такое vectorObj?
K>ну ладно ругаться больше не буду, а лучше достану свой хрустальный шар и немного потелепатирую... K>а вот теперь вижу, что vectorObj это std::vector<MyClass*> vectorObj K>Теперь отвечаю: вот так vectorObj + 7 делать нельзя, можно так: K>
K>*(&vectorObj[0] + 7)
K>
K>а надо так: K>
K>*(vectorObj.begin() + 7)
K>
K>Встречный вопрос: слово итератор тебе знакомо?
Только знакомо, сам не работал и не представляю как. Научи
Re[4]: std::vector
От:
Аноним
Дата:
15.09.04 09:39
Оценка:
Здравствуйте, korzhik, Вы писали:
K>Здравствуйте, Аноним, Вы писали:
K>>>возможно. K>>>vector как раз и задумывался как замена обычному массиву.
K>>>только зачем извращаться так? K>>>передавай итератор.
А>>В смысле я могу сделать так: vectorObj + 7, а если двумерный, да еще невыровненный???
K>ну ты даёшь! задаёшь вопрос про одно, а потом оказывается что уже всё изменилось.
K>во первых что такое vectorObj?
K>ну ладно ругаться больше не буду, а лучше достану свой хрустальный шар и немного потелепатирую... K>а вот теперь вижу, что vectorObj это std::vector<MyClass*> vectorObj K>Теперь отвечаю: вот так vectorObj + 7 делать нельзя, можно так: K>
K>*(&vectorObj[0] + 7)
K>
K>а надо так: K>
K>*(vectorObj.begin() + 7)
K>
K>Встречный вопрос: слово итератор тебе знакомо?
На самом деле вектор двумерный, да еще невыровненный.
Здравствуйте, Аноним, Вы писали:
K>>Встречный вопрос: слово итератор тебе знакомо? А>Только знакомо, сам не работал и не представляю как. Научи
ну в общем итератор это обобщённый указатель.
служит для того чтобы перебирать элементы какой-нибудь последовательности.
Более подробно нет времени объяснять, читай книги по STL и паттернам программирования.
применительно к контейнерам STL и в частности к std::vector:
есть два метода begin() и end(), которые возвращают итераторы.
begin() возвращает итератор на первый элемент последовательности
end() возвращает итератор на место следующее сразу за последним элементом.
пример:
std::vector<int> arr;
for (int i = 0; i < 5; ++i)
{
arr.push_back(i);
}
имеем такую ситуацию:
arr: 1, 2, 3, 4 ^
^ |
| |
arr.begin() arr.end()
то есть мы можем пройтись по нашей последовательности с помощью итераторов:
std::vector<int>::iterator it = arr.begin();
std::vector<int>::iterator last = arr.end();
for (; it != last; ++it)
{
std::cout << *it << std::endl;
}
итераторы бывают разных категорий (подробнее в книгах)
у vectora итератор произвольного доступа, то есть ты можешь делать так:
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, korzhik, Вы писали:
K>>Здравствуйте, Аноним, Вы писали:
K>>>>возможно. K>>>>vector как раз и задумывался как замена обычному массиву.
K>>>>только зачем извращаться так? K>>>>передавай итератор.
А>>>В смысле я могу сделать так: vectorObj + 7, а если двумерный, да еще невыровненный???
K>>ну ты даёшь! задаёшь вопрос про одно, а потом оказывается что уже всё изменилось.
K>>во первых что такое vectorObj?
K>>ну ладно ругаться больше не буду, а лучше достану свой хрустальный шар и немного потелепатирую... K>>а вот теперь вижу, что vectorObj это std::vector<MyClass*> vectorObj K>>Теперь отвечаю: вот так vectorObj + 7 делать нельзя, можно так: K>>
K>>*(&vectorObj[0] + 7)
K>>
K>>а надо так: K>>
K>>*(vectorObj.begin() + 7)
K>>
K>>Встречный вопрос: слово итератор тебе знакомо? А>Только знакомо, сам не работал и не представляю как. Научи
Здравствуйте, Анатолий Широков, Вы писали:
А>>На самом деле вектор двумерный, да еще невыровненный.
АШ>У вас примерно такая структура std::vector<myobject*> vec?
АШ>Если да, то тогда, чтобы работать с 7 строкой матрицы используйте vec[6]. А для обращения к элементам строки vec[6][0] и т.д.
АШ>В противном случае, проясните ситуацию.
Вы правильно меня поняли (извиняюсь, если ввел в заблуждение, надо было мне сразу писать все как есть)! Нужно получить указатель на начало 6 строки двумерного вектора и уже после перебрать все столбцы в этой 6-й строке
Re[7]: std::vector
От:
Аноним
Дата:
15.09.04 10:03
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Анатолий Широков, Вы писали:
А>>>На самом деле вектор двумерный, да еще невыровненный.
АШ>>У вас примерно такая структура std::vector<myobject*> vec?
АШ>>Если да, то тогда, чтобы работать с 7 строкой матрицы используйте vec[6]. А для обращения к элементам строки vec[6][0] и т.д.
АШ>>В противном случае, проясните ситуацию.
А>Вы правильно меня поняли (извиняюсь, если ввел в заблуждение, надо было мне сразу писать все как есть)! Нужно получить указатель на начало 6 строки двумерного вектора и уже после перебрать все столбцы в этой 6-й строке
Нужно видимо так Obj *myobj = &vector[6][0], далее myobj + 1, + 2, до конца строки. Правильно
А>Вы правильно меня поняли (извиняюсь, если ввел в заблуждение, надо было мне сразу писать все как есть)! Нужно получить указатель на начало 6 строки двумерного вектора и уже после перебрать все столбцы в этой 6-й строке
Здравствуйте, Аноним, Вы писали:
А>Вы правильно меня поняли (извиняюсь, если ввел в заблуждение, надо было мне сразу писать все как есть)!
Да, если правильно описать проблему, то решение находится гораздо быстрее
А>Нужно получить указатель на начало 6 строки двумерного вектора и уже после перебрать все столбцы в этой 6-й строке
std::vector<std::vector<int> > arr2d;
...
int* pRow6 = &arr2d[6][0];
или
int* pRow6 = &(*arr2d[6].begin());
или
int* pRow6 = &arr2d[6].front();
Здравствуйте, Анатолий Широков, Вы писали:
А>>Нужно видимо так Obj *myobj = &vector[6][0], далее myobj + 1, + 2, до конца строки. Правильно
АШ>Можно проще:
АШ>
АШ>Obj *myobj = vector[6];
АШ>
АШ>А далее myobj + 1, + 2
По-моему все окончательно запутались
Насколько я понимаю ситуацию, имеется
std::vector<std::vector<Obj*> > vec;
и поэтому "обычный" указатель на строку нужно получать так:
И вроде автор подтвердил, что имеем дело с std::vector<myobject*>, но а там кто его знает
Re[9]: std::vector
От:
Аноним
Дата:
15.09.04 10:25
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:
А>>Нужно видимо так Obj *myobj = &vector[6][0], далее myobj + 1, + 2, до конца строки. Правильно
АШ>Можно проще:
АШ>
АШ>Obj *myobj = vector[6];
АШ>
АШ>А далее myobj + 1, + 2
Спасибо
Re[9]: std::vector
От:
Аноним
Дата:
15.09.04 10:26
Оценка:
Здравствуйте, kvas, Вы писали:
K>Здравствуйте, Bell, Вы писали:
B>>