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

ассоциативный массив MAP хранящий указатели на векторы определенной структуры - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
BAKER3
0 / 0 / 0
Регистрация: 21.05.2011
Сообщений: 18
06.09.2012, 19:54     ассоциативный массив MAP хранящий указатели на векторы определенной структуры #1
вопрос: Если я создаю вектор, наполняю его данными и записываю указатель на него в MAP ,след шагом очищаю его. Я смогу обращаться к данному вектору через указатель или вектор будет утерян.
Идея такая есть заранее неизвестное количество элементов MAP.

есть структура
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct candle
{
...
};
 
vector <candle> temp; // временный вектор , его и будем наполнять.
...
map <string,string> instrument; // главный контейнер MAP в котором будут храниться указатели на вектора.
 
void add_instrument(string name,map <string,string> map,vector <candle> temp)
{
    
    map.insert( make_pair( name, temp) );
} // функция которая кладет вектор с опред структурой в MAP контейнер
Нужно уметь обращаться к векторам по имени( для этого и используем контейнер MAP)
Может быть, что я не так понял с указателями на вектора, но пока других идей нет.
Заранее спасибо за помощь.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2012, 19:54     ассоциативный массив MAP хранящий указатели на векторы определенной структуры
Посмотрите здесь:

C++ map<Int,MYMAP>, или мап хранящий мап
C++ Ассоциативный контейнер типа map
C++ Описать класс, хранящий динамический массив
C++ ассоциативный массив map c двумерным массивом
Шаблоны, векторы и указатели на функции C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
06.09.2012, 20:05     ассоциативный массив MAP хранящий указатели на векторы определенной структуры #2
Вы не вставите в std::map<std::string, std::string> вектор.

Добавлено через 4 минуты
Кроме того, я не совсем понял вопрос. Вы про это спрашивали?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <map>
#include <string>
#include <vector>
 
int main()
{
    std::vector<int> v = {1, 2, 3, 4, 5};
    std::map<std::string, decltype(v)*> m;
    m["vector"] = &v;
    for(const auto& elem: *m["vector"])
        std::cout << elem << ' ';
    std::cout << std::endl;
    m.clear();
    for(const auto& elem: v)
        std::cout << elem << ' ';
    std::cout << std::endl;
    return 0;
}
BAKER3
0 / 0 / 0
Регистрация: 21.05.2011
Сообщений: 18
06.09.2012, 20:55  [ТС]     ассоциативный массив MAP хранящий указатели на векторы определенной структуры #3
Цитата Сообщение от soon Посмотреть сообщение
Вы не вставите в std::map<std::string, std::string> вектор.

Добавлено через 4 минуты
Кроме того, я не совсем понял вопрос. Вы про это спрашивали?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <map>
#include <string>
#include <vector>
 
int main()
{
    std::vector<int> v = {1, 2, 3, 4, 5};
    std::map<std::string, decltype(v)*> m;
    m["vector"] = &v;
    for(const auto& elem: *m["vector"])
        std::cout << elem << ' ';
    std::cout << std::endl;
    m.clear();
    for(const auto& elem: v)
        std::cout << elem << ' ';
    std::cout << std::endl;
    return 0;
}
Использую

C++
1
using namespace std;
Вектор должен иметь структуру, а не тип int.
И очистка должна быть вектора, а не MAP.
C++
1
m.clear();
на
C++
1
v.clear();
Вопрос после очистки вектора смогу ли я обращаться к его элементам через указатель записанный в MAP.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
06.09.2012, 20:57     ассоциативный массив MAP хранящий указатели на векторы определенной структуры #4
Использую using namespace std;
Вектор должен иметь структуру, а не тип int.
Не суть.
Вопрос после очистки вектора смогу ли я обращаться к его элементам через указатель записанный в MAP.
Нет
BAKER3
0 / 0 / 0
Регистрация: 21.05.2011
Сообщений: 18
06.09.2012, 21:11  [ТС]     ассоциативный массив MAP хранящий указатели на векторы определенной структуры #5
Цитата Сообщение от soon Посмотреть сообщение
Не суть.
Нет
Спасибо.
Тогда еще один вопрос. Как хранить информацию в контейнере MAP. Заранее я не знаю сколько мне понадобится векторов.
На одном форуме мне ответили просто создайте MAP с указателями на вектора. Как создавать программно вектора с последующим обращениям к ним?

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

Заранее спасибо.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
06.09.2012, 21:19     ассоциативный массив MAP хранящий указатели на векторы определенной структуры #6
BAKER3, обрисуйте в общих чертах, чего вы хотите добиться. Желательно, абстрагируясь от реализации.
BAKER3
0 / 0 / 0
Регистрация: 21.05.2011
Сообщений: 18
06.09.2012, 21:41  [ТС]     ассоциативный массив MAP хранящий указатели на векторы определенной структуры #7
Цитата Сообщение от soon Посмотреть сообщение
BAKER3, обрисуйте в общих чертах, чего вы хотите добиться. Желательно, абстрагируясь от реализации.
Вообщем на конкурентном примере. Есть файл имеющий свою структуру.
C++
1
2
3
4
5
6
7
8
struct candle
{
string seccode;
string classcode;
int interval;
double open;
double high;
};
Мы не знаем количество файлов которые будем открывать и записывать в память при компиляции программы. Будем выбирать их количество программно , сколько файлов мы укажем столько и должно быть векторов. К этим векторам(массиву данных) нам нужно обращаться по имени. Вообщем как то так.

Допустим будет такая функция
C++
1
2
3
4
double get_candle(string Имя,int interval, string type(open или high), int number(номер записи в векторе))
{
...
}
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
06.09.2012, 21:48     ассоциативный массив MAP хранящий указатели на векторы определенной структуры #8
Используйте в map сами вектора, а не указатели на них.
BAKER3
0 / 0 / 0
Регистрация: 21.05.2011
Сообщений: 18
06.09.2012, 21:51  [ТС]     ассоциативный массив MAP хранящий указатели на векторы определенной структуры #9
Цитата Сообщение от soon Посмотреть сообщение
Используйте в map сами вектора, а не указатели на них.
Хорошо, а как программно их создавать и запоминать? ведь они объявляются на этапе компиляции.
Если можно код пожалуйста.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
06.09.2012, 21:58     ассоциативный массив MAP хранящий указатели на векторы определенной структуры #10
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
#include <iostream>
#include <unordered_map>
#include <string>
#include <vector>
#include <utility>
 
int main()
{
    std::vector<int> v1 = { 1, 2, 3, 4, 5 };
    std::vector<int> v2 = { 5, 4, 3, 2, 1 };
 
    std::unordered_map<std::string, std::vector<int>> m;
 
    m["first_vector"] = std::move(v1);
    m["second_vector"] = std::move(v2);
 
    for(const auto& elem: m["first_vector"])
        std::cout << elem << ' ';
    std::cout << std::endl;
 
    for(const auto& elem: m["second_vector"])
        std::cout << elem << ' ';
    std::cout << std::endl;
    
    return 0;
}
BAKER3
0 / 0 / 0
Регистрация: 21.05.2011
Сообщений: 18
06.09.2012, 22:01  [ТС]     ассоциативный массив MAP хранящий указатели на векторы определенной структуры #11
Цитата Сообщение от soon Посмотреть сообщение
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
#include <iostream>
#include <unordered_map>
#include <string>
#include <vector>
#include <utility>
 
int main()
{
    std::vector<int> v1 = { 1, 2, 3, 4, 5 };
    std::vector<int> v2 = { 5, 4, 3, 2, 1 };
 
    std::unordered_map<std::string, std::vector<int>> m;
 
    m["first_vector"] = std::move(v1);
    m["second_vector"] = std::move(v2);
 
    for(const auto& elem: m["first_vector"])
        std::cout << elem << ' ';
    std::cout << std::endl;
 
    for(const auto& elem: m["second_vector"])
        std::cout << elem << ' ';
    std::cout << std::endl;
    
    return 0;
}
тут 2 вектора объявленных на этапе компиляции программы, а нужно объявлять вектора по мере выполнения программы , мне сказали использовать указатели на векторы.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
06.09.2012, 22:07     ассоциативный массив MAP хранящий указатели на векторы определенной структуры #12
BAKER3, суть-то не изменится.
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
#include <iostream>
#include <unordered_map>
#include <string>
#include <vector>
#include <utility>
#include <cstdlib>
 
int main()
{
    const auto N    = 5u;
    const auto size = 3u;
 
    std::unordered_map<std::string, std::vector<int>> m;
 
    for(std::size_t i = 0; i < N; ++i)
    {
        std::vector<int> v(size);
 
        std::cout << "Enter vector #" << i << std::endl;
        for(std::size_t j = 0; j < size; ++j)
            std::cin >> v[j];
 
        std::cout << "Enter name" << std::endl;
        std::string name;
        std::cin >> name;
 
        m[name] = std::move(v);
    }
 
    for(const auto& p: m)
    {
        std::cout << p.first << " : ";
        for(const auto& elem: p.second)
            std::cout << elem << ' ';
        std::cout << std::endl;
    }
 
    return 0;
}
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
06.09.2012, 22:25     ассоциативный массив MAP хранящий указатели на векторы определенной структуры #13
тебе вообще не нужны два вектора. смотри сюда:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <vector>
#include <map>
#include <string>
 
...
std::vector<int> v;
std::map<std::string, std::vector<int> > m;
v.push_back (0);
m ["a"] = v;
v.push_vack (99);
m ["b"] = v;
v.clear();
int sive_v = v.size();
int size_a = m["a"].size();
int size_b = m["b"].size();
в конце кода у тебя - три вектора: один v, и два - помещенных в map. и длины векторов будут соотв 0, 1 и 2.
когда мы пишем
C++
1
m ["name"] = v;
то в мап запиывается не вектор-аргумент, а его копия. эти вектора не знают друг о друге потом, изменения в одном никак не отражаются на его копии.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2012, 22:26     ассоциативный массив MAP хранящий указатели на векторы определенной структуры
Еще ссылки по теме:

Ассоциативный массив C++
Можно ли создать вектор, хранящий векторы структур? C++
C++ Что лучше: динамические массивы, векторы, списки, map контейнеры или что-то ещё?

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

Или воспользуйтесь поиском по форуму:
BAKER3
0 / 0 / 0
Регистрация: 21.05.2011
Сообщений: 18
06.09.2012, 22:26  [ТС]     ассоциативный массив MAP хранящий указатели на векторы определенной структуры #14
Цитата Сообщение от soon Посмотреть сообщение
BAKER3, суть-то не изменится.
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
#include <iostream>
#include <unordered_map>
#include <string>
#include <vector>
#include <utility>
#include <cstdlib>
 
int main()
{
    const auto N    = 5u;
    const auto size = 3u;
 
    std::unordered_map<std::string, std::vector<int>> m;
 
    for(std::size_t i = 0; i < N; ++i)
    {
        std::vector<int> v(size);
 
        std::cout << "Enter vector #" << i << std::endl;
        for(std::size_t j = 0; j < size; ++j)
            std::cin >> v[j];
 
        std::cout << "Enter name" << std::endl;
        std::string name;
        std::cin >> name;
 
        m[name] = std::move(v);
    }
 
    for(const auto& p: m)
    {
        std::cout << p.first << " : ";
        for(const auto& elem: p.second)
            std::cout << elem << ' ';
        std::cout << std::endl;
    }
 
    return 0;
}
Спасибо большое за помощь!)
Yandex
Объявления
06.09.2012, 22:26     ассоциативный массив MAP хранящий указатели на векторы определенной структуры
Ответ Создать тему
Опции темы

Текущее время: 15:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru