Подскажите как добавлять данные в двухмерный вектор?// Создаем вектор
std::vector <std::vector <std::string> > MIX_DEV;Я как туда push_back() ?!?
В инете нашел как создавать их, а вот как добавлять данные - не нашел.
Зарание спасибо,
в таком духе...
вариант в лоб: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();
>[оверквотинг удален]
>вариант в лоб:
>
>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....
>Мне надо было бы что бы в первой мерности были к примеру
>string, а во второй int.Что вы имеете в виду? "В первой мерности" у вас вектора строк, во второй - строки...
>Мне надо было бы что бы в первой мерности были к примеру string, а во второй int.Может multimap использовать? Или не подойдёт?
vector<vector<string>> vv;vv.push_back(vector<string>());
vv[0].push_back("string 11");
vv[0].push_back("string 12");
vv.push_back(vector<string>());
vv[1].push_back("string 21");
vv[1].push_back("string 22");
vv[1].push_back("string 23");
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;С размерностями только осторожнее: строки (второй индекс) могут быть разных размеров.
>[оверквотинг удален]
>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 как тут еще один примерчик :)
Сейчас и это попробую для разнообразия )
>[оверквотинг удален]
>>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);Но это понятно не сработает.
Если ли какие-то способы?
Насколько я понял суть задачи:
struct channel
{ string name;
int value;
channel(const string &n, int v): name(n), value(v) {}
};//...
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++ не писал...
boost::variant поможет.
>>Мне надо было бы что бы в первой мерности были к примеру 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 для меня за сложно....
Но спасибо, когда созрею перепишу на нем :)Большое спасибо всем за помощь!
>http://www.cppreference.com/cppmap/all.htmlОй, перепутал ссылку. Вот брал от сюда:
>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’
>...Имелось в виду что-то вроде:
#include <vector>
#include <string>
#include <iostream>using namespace std;
struct channel
{ string name;
int value;
channel(const string &n, int v): name(n), value(v) {}
};int main()
{ 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;return 0;
}И оно прекрасно компиляется и работает.
А если уж использовать ассоциативный массив, то не multimap, а map, так как в первом возможно существование двух элементов с одним ключём (ключ у вас - это название канала), а это не ваш случай. Но одна из основных идей использования map - это обращение (поиск) к элементу по ключу. То есть для приведённого кода, что-то вроде ALL_MIX_DEV["PCM"] (для получения или установки соответствующего значения для канала PCM, например).
А вообще, лучше всего почитать Страуструпа, чтобы делать осознанный выбор. STL там довольно хорошо описан.
>[оверквотинг удален]
>А если уж использовать ассоциативный массив, то не multimap, а map, так
>как в первом возможно существование двух элементов с одним ключём (ключ
>у вас - это название канала), а это не ваш случай.
>Но одна из основных идей использования map - это обращение (поиск)
>к элементу по ключу. То есть для приведённого кода, что-то вроде
>ALL_MIX_DEV["PCM"] (для получения или установки соответствующего значения для канала PCM, например).
>
>
>А вообще, лучше всего почитать Страуструпа, чтобы делать осознанный выбор. STL там
>довольно хорошо описан.Спасибо, да компилится...
Я как раз тоже поменял с multimap на map...Теперь имею два варианта решения проблемы :)
Спасибо за помощь, jd!