Возврат указателя на векторный элемент в C++

COFF не сохраняет размеры массивов. Значение, связанное с символом массива, является его начальным адресом. Чтобы вывести размер массива dumpbin, необходимо использовать некоторую эвристику, например, глядя на соседние символы, конец раздела и т. д. По-видимому, эвристический сбой. Только компилятор знает, почему BSS больше, чем можно было ожидать.

60
задан idmean 26 March 2018 в 16:43
поделиться

6 ответов

Возвратите адрес вещи, на которую указывает итератор:

&(*iterator)

Редактирование: Для разрешения некоторого беспорядка:

vector <int> vec;          // a global vector of ints

void f() {
   vec.push_back( 1 );    // add to the global vector
   vector <int>::iterator it = vec.begin();
   * it = 2;              // change what was 1 to 2
   int * p = &(*it);      // get pointer to first element
   * p = 3;               // change what was 2 to 3
}

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

85
ответ дан 24 November 2019 в 17:47
поделиться

Возврат & итератор возвратит адрес итератора. Если Вы хотите возвратиться, способ относиться к элементу возвращают сам итератор.

Остерегаются этого, Вам не нужен вектор, чтобы быть глобальным для возврата итератора/указателя, но этого, операции в векторе могут делать недействительным итератор. Добавление элементов к вектору, например, может переместить векторные элементы в другое положение, если новый размер () больше, чем зарезервированная память. Удаление элемента перед данным объектом от вектора заставит итератор относиться к другому элементу.

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

РЕДАКТИРОВАНИЕ после комментария: 'да, я не хотел возвращать итератор a) потому что его константа и b) конечно, это - только локальный, временный итератор? †“Krakkos

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

Теперь с мысом константы. Если вызывающая сторона хочет выполнить модификации через возвращенный элемент (или указатель или итератор) тогда, необходимо использовать итератор неконстанты. (Просто удалите 'константу _' из определения итератора).

13
ответ дан David Rodríguez - dribeas 24 November 2019 в 17:47
поделиться

Это не хорошая идея возвратить итераторы. Итераторы становятся недопустимыми, когда модификации к вектору (inversion\deletion) происходят. Кроме того, итератор является локальным объектом, созданным на стеке, и следовательно возврат адреса того же нисколько не безопасен. Я предложил бы, чтобы Вы работали с myObject, а не векторными итераторами.

РЕДАКТИРОВАНИЕ: , Если объект легок тогда лучше, Вы возвращаете сам объект. Otheriwise возвращают указатели на myObject, сохраненный в векторе.

3
ответ дан aJ. 24 November 2019 в 17:47
поделиться

Пока Ваш вектор остается в глобальной области видимости, которую можно возвратить:

&(*iterator)

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

я переписал бы это как:

myObject myFunction(const vector<myObject>& objects)
{
    // find the object in question and return a copy
    return *iterator;
}

, Если необходимо изменить возвращенный myObject, сохраните значения как указатели и выделите их на "куче":

myObject* myFunction(const vector<myObject*>& objects)
{
    return *iterator;
}

Тот способ, которым Вы управляете, когда они разрушены.

Что-то вроде этого повредит Ваше приложение:

g_vector<tmpClass> myVector;

    tmpClass t;
    t.i = 30;
    myVector.push_back(t);

    // my function returns a pointer to a value in myVector
    std::auto_ptr<tmpClass> t2(myFunction());
3
ответ дан Aaron Saarela 24 November 2019 в 17:47
поделиться

Скажите, у Вас есть следующее:

std::vector<myObject>::const_iterator first = vObj.begin();

Тогда первый объект в векторе: *first. Для получения адреса используйте: &(*first).

Однако в соответствии с дизайном STL, я предложил бы, возвращают итератор вместо этого, если Вы планируете раздать его позже к алгоритмам STL.

0
ответ дан dirkgently 24 November 2019 в 17:47
поделиться

Вы храните копии myObject в векторе. Таким образом, я полагаю, что копирование экземпляра myObject не является дорогостоящей операцией. Тогда я думаю, что самым безопасным был бы возврат копия myObject от Вашей функции.

0
ответ дан Naveen 24 November 2019 в 17:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: