Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > из std::map в массив


Автор: box 30.3.2015, 16:51
всем привет!
как перегнать из контейнера map в массив char*
Код

chat* choices;

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

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

Добавлено через 3 минуты и 14 секунд
сравните: http://ideone.com/MJ81EM

Автор: box 30.3.2015, 17:50
надо именно в массив ибо menu от ncurces работает только с массивами char* 

Автор: box 30.3.2015, 18:45
 а как добавить нуль терминатор \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,
                  };

Автор: baldina 30.3.2015, 22:14
0 в конце строк есть, а 0 в массив добавьте вручную (сделайте массив на один больше)

Автор: box 31.3.2015, 17:23
ситуация изменилась, теперь надо из вектора переложить все в 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

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

что в векторе лежит? явно не char*

Автор: box 31.3.2015, 17:56
в векторе следующие:
Код

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

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

Автор: box 31.3.2015, 18:38
ну да, именно число|строка надо поместить в массив testarray[i] = "число|строка"

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

Код

#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.

Автор: box 31.3.2015, 19:03
а вы считаете что не надо очищать ss перед началом работы с следующим эллементом ?

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

Автор: box 31.3.2015, 19:11
ясно
если я правельно понял то делаем так:
Код

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

а как же поместить строку в const char*

Автор: rudolfninja 31.3.2015, 19:19
Да, выправильно поняли, все именно так и будет.
Вы понимаете, что в строке 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*

Автор: baldina 31.3.2015, 23:27
Цитата(rudolfninja @  31.3.2015,  19:19 Найти цитируемый пост)
Если вам действительно нужна строка const char

ему нужен массив С-строк

Цитата(box @  31.3.2015,  19:11 Найти цитируемый пост)
а как же поместить строку в const char* 

const char* это указатель на область памяти, которую вам придется выделять вручную. посмотрите мой первый пример.

Автор: rudolfninja 1.4.2015, 00:26
Цитата(baldina @  31.3.2015,  23:27 Найти цитируемый пост)
ему нужен массив С-строк

Если ему нужен массив С-строк, то одним указателем тут не отделаться. Тогда уж надо, как вы сказали, использовать вектор строк.
Но, вроде как, автору подошел вариант, который я предложил.

Автор: mes 2.4.2015, 23:16
Цитата(rudolfninja @  31.3.2015,  23:26 Найти цитируемый пост)
Если ему нужен массив С-строк, то одним указателем тут не отделаться. 

отделаться ) '\0' как разделитель строк, и '\0\0' для конца списка

Автор: baldina 3.4.2015, 13:58
указателей меньше не станет, только выделений памяти

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)