Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> из std::map в массив 
:(
    Опции темы
box
Дата 30.3.2015, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 27.2.2007

Репутация: нет
Всего: 0



всем привет!
как перегнать из контейнера map в массив char*
Код

chat* choices;

for(auto const &it1 : mymap_fast_alert) {
string tmp = it1.second + " |" + it1.first;// << endl;
choices[k] = tmp.c_str();
k++;
}

PM MAIL   Вверх
baldina
Дата 30.3.2015, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



а где у вас массив то?
что-то типа http://ideone.com/zyEk7B
а зачем вам массив char*? c vector<string> попроще будет

Добавлено через 3 минуты и 14 секунд
сравните: http://ideone.com/MJ81EM
PM MAIL   Вверх
box
Дата 30.3.2015, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 27.2.2007

Репутация: нет
Всего: 0



надо именно в массив ибо menu от ncurces работает только с массивами char* 
PM MAIL   Вверх
box
Дата 30.3.2015, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 27.2.2007

Репутация: нет
Всего: 0



 а как добавить нуль терминатор \0 в конце каждого choices[k] и NULL в конце массива, надо привести массив к такому виду:
Код

char *choices[] = {
                        "Choice 1",
                        "Choice 2",
                        "Choice 3",
                        "Choice 4",
            "Choice 5",
            "Choice 6",
            "Choice 7",
            "Choice 8",
            "Choice 9",
            "Choice 10",
                        (char *)NULL,
                  };

PM MAIL   Вверх
baldina
Дата 30.3.2015, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



0 в конце строк есть, а 0 в массив добавьте вручную (сделайте массив на один больше)
PM MAIL   Вверх
box
Дата 31.3.2015, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 27.2.2007

Репутация: нет
Всего: 0



ситуация изменилась, теперь надо из вектора переложить все в const char* testarray[1000]
пробую так :
Код

const char* testarray[1000];
copy(vect.begin(), vect.end(), testarray);


но получаю при компиляции:

In file included from /usr/include/c++/4.7/unordered_map:41:0,
                 from suric.cpp:12:
/usr/include/c++/4.7/bits/stl_algobase.h: In instantiation of ‘static _OI std::__copy_move<false, false, std::random_access_iterator_tag>::__copy_m(_II, _II, _OI) [with _II = std::pair<std::basic_string<char>, long unsigned int>*; _OI = const char**]’:
/usr/include/c++/4.7/bits/stl_algobase.h:384:70:   required from ‘_OI std::__copy_move_a(_II, _II, _OI) [with bool _IsMove = false; _II = std::pair<std::basic_string<char>, long unsigned int>*; _OI = const char**]’
/usr/include/c++/4.7/bits/stl_algobase.h:422:39:   required from ‘_OI std::__copy_move_a2(_II, _II, _OI) [with bool _IsMove = false; _II = __gnu_cxx::__normal_iterator<std::pair<std::basic_string<char>, long unsigned int>*, std::vector<std::pair<std::basic_string<char>, long unsigned int> > >; _OI = const char**]’
/usr/include/c++/4.7/bits/stl_algobase.h:454:18:   required from ‘_OI std::copy(_II, _II, _OI) [with _II = __gnu_cxx::__normal_iterator<std::pair<std::basic_string<char>, long unsigned int>*, std::vector<std::pair<std::basic_string<char>, long unsigned int> > >; _OI = const char**]’
suric.cpp:770:41:   required from here
/usr/include/c++/4.7/bits/stl_algobase.h:329:8: error: cannot convert ‘std::pair<std::basic_string<char>, long unsigned int>’ to ‘const char*’ in assignment

PM MAIL   Вверх
baldina
Дата 31.3.2015, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(box @  31.3.2015,  17:23 Найти цитируемый пост)
 cannot convert ‘std::pair<std::basic_string<char>, long unsigned int>’ to ‘const char*’

что в векторе лежит? явно не char*
PM MAIL   Вверх
box
Дата 31.3.2015, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 27.2.2007

Репутация: нет
Всего: 0



в векторе следующие:
Код

   vector<pair<std::string, uint64_t> > vect;

PM MAIL   Вверх
rudolfninja
Дата 31.3.2015, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: 1
Всего: 6



Ну так у вас в веторе пары значений <строка - число>, а вы хотите это все закинуть в const char[]. Что именно из этого вектора вам надо закинуть в массив const char?
Если вы хотите сделать в массиве такую же пару, только в виде строки, типа "строка - число", а потом поместить это в массив, то вам надо сначала эту пару представить в виде строки, а затем поместить ее в массив.

Это сообщение отредактировал(а) rudolfninja - 31.3.2015, 18:21
PM MAIL Skype   Вверх
box
Дата 31.3.2015, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 27.2.2007

Репутация: нет
Всего: 0



ну да, именно число|строка надо поместить в массив testarray[i] = "число|строка"
PM MAIL   Вверх
rudolfninja
Дата 31.3.2015, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: 1
Всего: 6



Понятно, тогда, я бы написал функцию, которая перегоняет пару в строку. Один из вариантов:

Код

#include <sstream>

std::string pair2string(std::pair<std::string, unsigned int> pair)
{
    std::stringstream ss;
    std::string result;
    
    ss << pair.second;
    result += ss.str();
    result.push_back('|');
    result += pair.first;

    return result;
}


Использование этой функции простое: проходите по вектору, получаете элемент, передаете его в эту функцию, а на выходе получаете его строковое представление.

Вот если вы хотите, чтоб у вас элементом итогового массива была строка, а не символ, то вам надо двумерный массив char'ов или можно сделать вектор из std::string.
PM MAIL Skype   Вверх
box
Дата 31.3.2015, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 27.2.2007

Репутация: нет
Всего: 0



а вы считаете что не надо очищать ss перед началом работы с следующим эллементом ?
PM MAIL   Вверх
rudolfninja
Дата 31.3.2015, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: 1
Всего: 6



Считаю, что нет. Потому что один вызов функции у вас будет для одного элемента. ss - локальная и не статическая переменная функции. Это значит, что по выходу из функции для нее будет вызыван деструктор, сам поток будет очищен, а переменная удалена из памяти.
Когда мы войдем в функцию для следующего элемента, то эта ss создастся заново с помощью конструктора по умолчанию и будет пустой.
Ну это в теории так =)

Это сообщение отредактировал(а) rudolfninja - 31.3.2015, 19:12
PM MAIL Skype   Вверх
box
Дата 31.3.2015, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 27.2.2007

Репутация: нет
Всего: 0



ясно
если я правельно понял то делаем так:
Код

for(size_t i = 0; i < vect.size(); ++i)
{
std::string s = pair2string(vect[i]);
}

а как же поместить строку в const char*
PM MAIL   Вверх
rudolfninja
Дата 31.3.2015, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: 1
Всего: 6



Да, выправильно поняли, все именно так и будет.
Вы понимаете, что в строке const char у вас не будет возможности получить отдельную пару просто указав ее индекс? У вас будет массив символов, образующих новую последовательность. И обратившись подобным образом
Цитата

testarray[i] 

вы получите один символ, а не строку.
Если вам действительно нужна строка const char, в которой, допустим, все полученный пары разделены пробелами, то можно использовать такой код:

Код

std::string test_str;
for(size_t i = 0; i < vect.size(); ++i)
{
test_str += pair2string(vect[i]);
test_str.push_back(' ');
}
test_str.pop_back(); // удалим последний пробел, т.к. он лишний
test_str.c_str(); // вернет вам const char*


Это сообщение отредактировал(а) rudolfninja - 31.3.2015, 20:07
PM MAIL Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1676 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.