The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Двухмерный вектор , !*! siegerstein, 25-Окт-07, 00:32  [смотреть все]
Подскажите как добавлять данные в двухмерный вектор?

// Создаем вектор
std::vector <std::vector <std::string> > MIX_DEV;

Я как туда push_back() ?!?

В инете нашел как создавать их, а вот как добавлять данные - не нашел.

Зарание спасибо,

  • Двухмерный вектор , !*! tx2, 02:28 , 25-Окт-07 (1)
    • Двухмерный вектор , !*! siegerstein, 02:54 , 25-Окт-07 (3)
      >[оверквотинг удален]
      >вариант в лоб:
      >
      >std::vector< std::vector< int > > test;
      >
      >std::vector< int > v1;
      >v1.push_back(1);
      >v1.push_back(2);
      >v1.push_back(3);
      >test.push_back(v1);
      >v1.clear();

      Спасибо tx2, вышло.

      Мне надо было бы что бы в первой мерности были к примеру string, а во второй int.
      Но как я понимаю с векторами это не выйдет.
      Есть ли идеи как это сделать?
      А то придется переводить из string в int....

  • Двухмерный вектор , !*! jd, 02:50 , 25-Окт-07 (2)
    • Двухмерный вектор , !*! siegerstein, 02:57 , 25-Окт-07 (4)
      >[оверквотинг удален]
      >vv.push_back(vector<string>());
      >vv[2].push_back("string 31");
      >vv[2].push_back("string 32");
      >
      >for(int i=0; i<3; i++)
      >  for(int j=0; j<2; j++)
      >    cout<<vv[ i][j]<<endl;
      >

      >
      >С размерностями только осторожнее: строки (второй индекс) могут быть разных размеров.

      Спасибо jd, не успел ответить tx2 как тут еще один примерчик :)
      Сейчас и это попробую для разнообразия )

      • Двухмерный вектор , !*! siegerstein, 03:03 , 25-Окт-07 (5)
        >[оверквотинг удален]
        >>for(int i=0; i<3; i++)
        >>  for(int j=0; j<2; j++)
        >>    cout<<vv[ i][j]<<endl;
        >>
        >>
        >>С размерностями только осторожнее: строки (второй индекс) могут быть разных размеров.
        >
        >Спасибо jd, не успел ответить tx2 как тут еще один примерчик :)
        >
        >Сейчас и это попробую для разнообразия )

        С векторами разобрался, теперь вопрос как засунут разные типы данных в вектор, или как это можна сделать :)

        Что-то типа такого:

        std::vector< std::vector< int > > test;

        std::vector< int > v1;
        std::vector< std::string > v2;

        v1.push_back(15);
        v1.push_back(24);
        v1.push_back(8);

        v2.push_back("PCM");
        v2.push_back("VOL");
        v2.push_back("MIC");

        test.push_back(v1);
        test.push_back(v2);

        Но это понятно не сработает.
        Если ли какие-то способы?

        • Двухмерный вектор , !*! jd, 03:18 , 25-Окт-07 (7)
        • Двухмерный вектор , !*! DeadMustdie, 09:30 , 25-Окт-07 (9)
          • Двухмерный вектор , !*! siegerstein, 17:24 , 25-Окт-07 (10)
            >>Мне надо было бы что бы в первой мерности были к примеру string, а во второй int.
            >
            >Может multimap использовать? Или не подойдёт?

            Спасибо, как раз подошло!

            http://www.cppreference.com/cppmap/all.html

            Кусок моей  реализации (OSS /dev/mixer):

                std::multimap<std::string, int> ALL_MIX_DEV;

                // List of ALL avaible devices
                for (int i = 0; i < SOUND_MIXER_NRDEVICES; i++) {
                    ALL_MIX_DEV.insert(std::pair<std::string, int>(sound_device_names[i], i));
            }
                
                    for (std::multimap<std::string, int>::iterator it = ALL_MIX_DEV.begin(); it != ALL_MIX_DEV.end(); ++it) {
                    std::cout << "  [" << (*it).first << ", " << (*it).second << "]" << std::endl;
            }

            ....

                                std::pair<std::multimap<std::string, int>::iterator, std::multimap<std::string, int>::iterator> ppp;
                                ppp = ALL_MIX_DEV.equal_range(v[1]);
                                std::multimap<std::string, int>::iterator it2 = ppp.first;
                                
                                ioctl(mixer_fd, MIXER_READ((*it2).second), &level);
                                std::cout << std::setw(7) << (level & 0xff) << (level & 0xff) << std::endl;
                                
            ....


            >[оверквотинг удален]
            > //...
            > vector<channel> v;
            > v.push_back(channel("PCM", 15));
            > v.push_back(channel("VOL", 24));
            > v.push_back(channel("MIC", 8));
            >
            > for(int i=0; i<3; i++)
            >  cout<<v[ i].name<<": "<<v[ i].value<<endl;
            >
            > Хотя может и перемудрил чего - давно на C++ не писал...

            Не компилится че-то... :

            f.vector.cpp: In function ‘int main()’:
            f.vector.cpp:15: ошибка: в ‘main()::channel’ используется локальный тип ‘main()::channel’
            f.vector.cpp:15: ошибка:   при конкретизации ‘template<class _Alloc> class std::allocator’
            f.vector.cpp:15: ошибка: некорректный аргумент шаблона 2
            f.vector.cpp:15: ошибка: invalid type in declaration before ‘;’ token
            f.vector.cpp:16: ошибка: запрос элемента ‘push_back’ в ‘v’, имеющего не классовый тип ‘int’
            f.vector.cpp:17: ошибка: запрос элемента ‘push_back’ в ‘v’, имеющего не классовый тип ‘int’
            f.vector.cpp:18: ошибка: запрос элемента ‘push_back’ в ‘v’, имеющего не классовый тип ‘int’
            f.vector.cpp:21: ошибка: некорректные типы ‘int[int]’ для индекса массива
            f.vector.cpp:21: ошибка: некорректные типы ‘int[int]’ для индекса массива

            > boost::variant поможет.
            > http://www.boost.org/doc/html/variant.html

            Я в C++ еще новичок, и Boost для меня за сложно....
            Но спасибо, когда созрею перепишу на нем :)

            Большое спасибо всем за помощь!

            • Двухмерный вектор , !*! siegerstein, 17:29 , 25-Окт-07 (11)
            • Двухмерный вектор , !*! jd, 06:32 , 26-Окт-07 (12)
              • Двухмерный вектор , !*! siegerstein, 15:38 , 26-Окт-07 (13)
                >[оверквотинг удален]
                >А если уж использовать ассоциативный массив, то не multimap, а map, так
                >как в первом возможно существование двух элементов с одним ключём (ключ
                >у вас - это название канала), а это не ваш случай.
                >Но одна из основных идей использования map - это обращение (поиск)
                >к элементу по ключу. То есть для приведённого кода, что-то вроде
                >ALL_MIX_DEV["PCM"] (для получения или установки соответствующего значения для канала PCM, например).
                >
                >
                >А вообще, лучше всего почитать Страуструпа, чтобы делать осознанный выбор. STL там
                >довольно хорошо описан.

                Спасибо, да компилится...
                Я как раз тоже поменял с multimap на map...

                Теперь имею два варианта решения проблемы :)

                Спасибо за помощь, jd!




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру