Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
rikimaru2013
C++ Game Dev
2419 / 1113 / 240
Регистрация: 30.11.2013
Сообщений: 3,660
#1

Указатель на std::vector - C++

26.08.2015, 18:26. Просмотров 447. Ответов 12
Метки нет (Все метки)

Добрый вечер,

всегда боялся передавать доступ к std::vector'y класса через:
1) указатель на контейнер
2) ссылка на контейнер
3) константная копия контейнера


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <vector>
using namespace std;
 
class A
{
public:
    typedef std::pair<int, float> SOME_COOL_VALUE_NAME;
    typedef std::vector<SOME_COOL_VALUE_NAME> SOME_COOL_NAME;
 
private:
    SOME_COOL_NAME              m_arr;
public:
    SOME_COOL_NAME*             getPointOnArr()
    {
        return &m_arr;
    }
    SOME_COOL_NAME&             getRefArr()
    {
        return m_arr;
    }
 
    void                        setNewValue( SOME_COOL_VALUE_NAME newVal )
    {
        m_arr.push_back( newVal );
    }
};
 
void    process( A::SOME_COOL_NAME* arrPoint )
{
    for(auto& it : *arrPoint)
    {   
        cout << "getted like point:  " << it.first << " " << it.second << endl;
    }
}
void    process2( A::SOME_COOL_NAME& arrPoint )
{
    for(auto& it : arrPoint)
    {
        cout << "getted line ref:  " << it.first << " " << it.second << endl;
    }
}
int main()
{
    A a;
    a.setNewValue( { 12, 3.02 } );
    process( a.getPointOnArr() );
    process2( a.getRefArr( ) );
    
}

Мои аргументы, что не давали мне этого сделать:
1) внутреняя реализация класса А, его "основной" икапсулируемых класс-мембер может быть изменён без его ведома.


Для чего мне нужно: - иногда так хочется дать указатель, чтобы другой порылся в контейнере - нашёл себе что искал и сохранил указатель на тот найденный объект.
Сейчас: - через 3 класса прокидываю
C++
1
shared_ptr<T> getPointer(SeachStructParametres asker);
Посуте не смогу затереть указатель этот так как в контейнере останется на него умный указатель - что является защитой от минуса описанного выше, могу лишь выставить флаг, что сообщит в дальнейшем классу владельцу контейнера, что данный экземпляр должен умереть!! *тут_зловестный_смех*
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.08.2015, 18:26     Указатель на std::vector
Посмотрите здесь:

Передача функции указатель на элемент std::vector<std::string> - C++
Доброй ночи тем, кому не спится (или живет в другом часовом поясе:p)! Есть функция, требующая в качестве параметра указатель на...

Обращение к элементам std::vector используя указатель - C++
Доброго времени суток. В цикле обрабатывается большое количество элементов вектора. Прочел, что обращение через индекс в 2а раза...

Как передать целочисленную матрицу типа std::vector<std::vector<int> > в функцию? - C++
Здравствуйте. Почитал на форуме, но так и не понял что я делаю не так. Имеется двумерный вектор. Размера .. Нужно его передать в...

Вывести значения std::vector<std::vector<int*> > - C++
Подскажите, как вывести значения? const size_t row = 3; const size_t col = 3; std::vector&lt;std::vector&lt;int*&gt; &gt; imatrix; //...

Как изменять размер std::vector<std::vector>? - C++
Здравствуйте, как нужно изменять размер std::vector&lt;std::vector&gt; например: std::vector&lt;std::vector&lt;float&gt;&gt; data; ...

Std::vector<std::pair<std::vector<int>::iterator, std::vector<int>::iterator> - C++
Вопрос по вектору. Допустим есть вектор, std::vector&lt;int&gt; vec; на каком - то этапе заполнения я ставлю закладку итератора, ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
26.08.2015, 18:44     Указатель на std::vector #2
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
1) указатель на контейнер
2) ссылка на контейнер
По-моему это наоборот самые лучшие варианты передачи контейнеров.
Для безопасности используют ссылку или указатель на константу.
Или я чего-то не понял?
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,930
Завершенные тесты: 1
26.08.2015, 18:50     Указатель на std::vector #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
В свете последних решений партии и правительства имеет смысл написать в классе A шаблонную функцию-искалку, принимающую проверятор некоего условия.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class A {
// тут содержимое класса
public:
    template<typename Condition>
    SomeCoolValueName find(Condition cond) const
    {
        const auto ti = std::find_if(m_arr.begin(), m_arr.end(), cond);
        if(it != m_arr.end())
            return *it;
        else
            return SomeCoolValueName(-1, -1);  // заведомо негодное значение сигнализирует, что ничего не нашлось
    }
};
В качестве такого проверятора очень удобно будет вписать лямбду:

C++
1
const auto result = a.find([] (const A::SomeCoolValueName& val) {return val.first == val.second;});
А вываливать наружу внутренности партия и правительство не рекомендуют.
rikimaru2013
C++ Game Dev
2419 / 1113 / 240
Регистрация: 30.11.2013
Сообщений: 3,660
26.08.2015, 21:13  [ТС]     Указатель на std::vector #4
Цитата Сообщение от Nick Alte Посмотреть сообщение
такого
И как через std::bind прокинуть это ?
C++
1
2
template<typename Condition>
    SomeCoolValueName find(Condition cond) const
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
26.08.2015, 21:22     Указатель на std::vector #5
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
И как через std::bind прокинуть это ?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <functional>
 
template <typename T>
void foo( T t ) {
    std::cout << t << std::endl;
}
 
int main()
{
    int value = 123;
    auto f = std::bind( foo<decltype(value)>, value );
    f();
}
rikimaru2013
C++ Game Dev
2419 / 1113 / 240
Регистрация: 30.11.2013
Сообщений: 3,660
26.08.2015, 21:35  [ТС]     Указатель на std::vector #6
так value же не известно в какой-то момент ((( сейчас набросаю тестовый

Добавлено через 12 минут
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <iostream>
#include <vector>
#include <memory>
#include <ctime>
#include <functional>
using namespace std;
 
class Object
{
private:
    int         m_hp;
public:
    Object()
    {
        m_hp = rand() % 100 + 20;
    }
    bool isCool() const
    {
        return true;
    }
    int healthPoint()
    {
        return m_hp;
    }
 
};
 
 
class Storage
{
private:
    std::vector<std::shared_ptr<Object>>            m_container;
public:
    Storage()
    {
        m_container.reserve(100);
        for(int i = 0; i < 100; i++)
        {
            m_container.push_back(std::shared_ptr<Object>(new Object()));
        }
    }
    template<typename Condition>
    std::shared_ptr<Object> find(Condition cond) const
    {
        auto ti = std::find_if(m_container.begin(), m_container.end(), cond);
        if(it != m_container.end())
            return *it;
        else
            return nullptr;
    }
 
};
 
class NeedToSeach
{
private:
    XXXX        m_seacher;
public:
    NeedToSeach(XXXX seacher)
    {
        m_seacher = seacher;
    }
 
 
    void foo()
    {
        std::shared_ptr<Object> ptr = m_seacher([](std::shared_ptr<Object> currentSeachTarget) {
            
            bool result = false;
            if(currentSeachTarget->isCool() && currentSeachTarget->healthPoint() >= 100)
            {
                result = true;
            }
            else if(!currentSeachTarget->isCool() && currentSeachTarget->healthPoint() >= 30)
            {
                result = true;
            }
            return result;
        
        });
    }
};
class System
{
    private:
        std::shared_ptr<Storage>            m_storage;
        std::shared_ptr<NeedToSeach>        m_needToSeach;
public:
    System()
    {
        m_storage.reset(new Storage());
        m_needToSeach.reset(new NeedToSeach(std::bind(&Storage::find<XXXX>, m_storage, std::placeholders::_1 /*для condiotional же надо тут ????*/)));
    }
 
 
    void run()
    {
        m_needToSeach->foo();
    }
 
};
void main()
{
    srand(time(0));
    System system;
    system.run();
}
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
26.08.2015, 21:37     Указатель на std::vector #7
rikimaru2013, в чём задача?
rikimaru2013
C++ Game Dev
2419 / 1113 / 240
Регистрация: 30.11.2013
Сообщений: 3,660
26.08.2015, 21:40  [ТС]     Указатель на std::vector #8
Цитата Сообщение от castaway Посмотреть сообщение
rikimaru2013, в чём задача?
в 67 строке получить правильную выборку
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
26.08.2015, 22:17     Указатель на std::vector #9
rikimaru2013, а ты можешь заставить это работать без bind?
rikimaru2013
C++ Game Dev
2419 / 1113 / 240
Регистрация: 30.11.2013
Сообщений: 3,660
26.08.2015, 22:25  [ТС]     Указатель на std::vector #10
Код практически идентичный. Создаётся класс TowerSystem, UnitStorage - где первый должен уметь получать укзаатель "правильного таргета", чтобы создать туда bullet с самонаводкой, и присвоить цели кое-какие атрибуты, чтобы все рядом стоящие товера не пускали выстрелы в моба с 10 хп. Пока, Nick Alte, не написал было сделан "лиш бы как лиш бы живо" - посылал структуру (нужна цель){на растояние не больше 200, с обычным типом защиты, идущая как можно ближе комне}
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
26.08.2015, 22:36     Указатель на std::vector #11
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Код практически идентичный. Создаётся класс TowerSystem, ...
С bind код не менее идентичен. Добавляется bind и...
Я не могу (в данном случае) и не хочу (в общем случае) решать проблему, связанную с твоей игрой. Другое дело, если у тебя есть вопросы по языку.
Как-то незаметно тема перетекла из указателей с ссылками в bind, и из bind в решение проблем твоей игры...
Извини, но мне кажется ты просто "пудришь мозги".
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,930
Завершенные тесты: 1
27.08.2015, 19:09     Указатель на std::vector #12
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Создаётся класс TowerSystem, UnitStorage - где первый должен уметь получать укзаатель "правильного таргета", чтобы создать туда bullet с самонаводкой
Ну а тут надо уже решать проблемы дизайна вообще и проблему владения в частности. В очень приблизительном приближении я бы сказал, что карта должна владеть мобами, башни должны проходиться по мобам примерно так, как я описывал, а пуля с самонаводкой владеть мобом (читай - хранить на него shared_ptr), даже совместно с картой, не должна. Тупое решение "в лоб" - карта хранит shared_ptr с мобами, а пуля - weak_ptr. Решение получше - пуля хранит уникальный идентификатор, который можно предъявить карте и получить соответствующего моба, или фигу, если он уже склеил ласты / убран.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2015, 20:33     Указатель на std::vector
Еще ссылки по теме:

Std::vector/QVector в классе или std::vector/QVector классов? - C++
Доброе время суток! Собственно вопрос в самой теме, есть некий класс class WorkJornal { private: string manager; ...

статическая и динамическая матрица на std::array and std::vector - C++
Всем привет. Решил немного поиграться с шаблонами. Скилл чуть больше 0. Можно ли с помощью шаблонной магии подставить вместо...

std::map, std::vector и порядок обхода коллекции - C++
Здравствуйте, уважаемые! Вопрос следующий - если я сохраняю какие-то значения в map или вектор, то всегда ли я буду получать тот-же...

Error C2664: std::vector<_Ty>::push: невозможно преобразовать параметр 1 из 'double' в 'const std::string &' - C++
#include &lt;iostream&gt; #include &lt;stack&gt; #include &lt;sstream&gt; #include &lt;string&gt; using namespace std; int main() { string...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
rikimaru2013
C++ Game Dev
2419 / 1113 / 240
Регистрация: 30.11.2013
Сообщений: 3,660
27.08.2015, 20:33  [ТС]     Указатель на std::vector #13
Цитата Сообщение от Nick Alte Посмотреть сообщение
тут
Я думаю в вопросе темы передавать уже указатель на базовый тип предиката, внутри базы определять, что пришло (тут у меня кастыль-кастылём, но лучше вариант не могу придумать, а некоторые лиж бы ... в этой теме). Да решения слабое, но какое могу додумать


Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <iostream>
#include <vector>
#include <ctime>
#include <algorithm>
using namespace std;
 
class Foo
{
    int _x;
public:
    Foo()
    {
        _x = rand() % 30;
    }
    int get() const
    {
        return _x;
    }
};
 
 
class Seach
{
public:
    bool operator()(Foo* ptr)
    {
        return this->fakeCall(ptr);
    };  
    virtual bool fakeCall(Foo* ptr) = 0
    {
 
    }
};
class Seach1 : public Seach
{
public:
    bool operator()(Foo* ptr)
    {
        return this->fakeCall(ptr);
    };
    virtual bool fakeCall(Foo* ptr) override
    {
        int r = ptr->get();
        cout << "seach1 : " << r << endl;
        return true;
    }
};
class Seach2 : public Seach
{
public:
    bool operator()(Foo* ptr)
    {
        return this->fakeCall(ptr);     
    };
    virtual bool fakeCall(Foo* ptr) override
    {
        int r = ptr->get();
        cout << "seach2 : " << r << endl;
        return true;
    }
};
 
class Base
{
private:
    std::vector<Foo*>   arr;
 
public:
    Base()
    {
        for(int i = 0; i < 10; i++)
        {
            arr.push_back(new Foo());
        }
    }
    int seach(Seach* cond)
    {
        if(dynamic_cast<Seach1*>(cond))
        {
            Seach1* temp = dynamic_cast<Seach1*>(cond);
            return std::all_of(arr.begin(), arr.end(), (*temp));
        }
        else if (dynamic_cast<Seach2*>(cond))
        {
            Seach2* temp = dynamic_cast<Seach2*>(cond);
            return std::all_of(arr.begin(), arr.end(), (*temp));
        }
    }
};
 
 
void main()
{
    srand(time(0));
    
    Base a;
 
    auto result = a.seach(new Seach1());
    //auto result = a.seach(new Seach2());
 
}



С архитектурой уже больно менять, что-то. Просто хочу почитать где-то о таких паттернах написания "выборки"
Yandex
Объявления
27.08.2015, 20:33     Указатель на std::vector
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru