вернуть указатель на элемент в векторе (из итератора) - PullRequest
0 голосов
/ 16 октября 2018

Я хочу иметь функцию, которая выполняет итерацию по вектору, выбирает и выбирает элемент, который затем возвращает потребителю в виде указателя, т.е. указатель должен указывать на элемент в векторе.Пока что у меня есть:

#include <vector>
class data_t {
    public:
    data_t(){mydat=99;}
    ~data_t(){}
    int get_dat(){return mydat;}
    private:
    int mydat;
};
void *myfunc(std::vector<data_t> foo);

int main(void) {
    std::vector<data_t> container;
    data_t tmp;
    data_t *res=nullptr;
    container.push_back(tmp);
    container.push_back(tmp);
    res = (data_t*)myfunc(container);
    res->get_dat();
}
void *myfunc(std::vector<data_t> foo) {
    for (auto itr = foo.begin(); itr != foo.end(); itr++) {
        if (itr->get_dat())
            return &*itr;
    }
    return nullptr;
}

, но я не уверен насчет return &*itr - так как не кажется правильным сначала разыменовать итератор, а затем вернуть указатель на него.Кроме того, хотя itr локально, оно указывает на глобально доступный векторный элемент.Как мне сделать это лучше?

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Сигнатура этой функции кричит мне "неправильно"

void *myfunc(std::vector<data_t> foo);

Вы не должны возвращать void *, и вы не должны брать вектор по значению.

using data_vec = std::vector<data_t>;
data_vec::iterator myfunc(data_vec & foo);

Теперь вам не нужно разыгрывать main и инициализировать nullptr

int main(void) 
{
    data_vec container;

    container.emplace_back();
    container.emplace_back();

    auto res = myfunc(container);
    res->get_dat();
}
.
0 голосов
/ 16 октября 2018

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

Было бы далеко менее уникальным, чтобы передать вектор (предпочтительно) const ссылкой и либо вернуть size_t (или, педантично * 1012)*) введите индекс элемента или итератор (ваше значение itr) для элемента в контейнере.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...