2013-02-21 8 views
-1

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

void generateKey(const std::vector<unsigned int>& varSet, string& key) 
    { 
    // Generate a string by concatinating intergers as v_12_34_5 
    stringstream varNames; 
    varNames <<"v"; 

    for (unsigned int i = 0; i < varSet.size(); i++) 
     { 
     varNames <<"_"<<varSet[i]; 
     } 
    key = varNames.str(); 
    } 

Спасибо, чтобы помочь мне написать код для обратного разбора этой строки ключа в целых вектор.

+2

Это похоже на несколько вопросов, отображаемых на боковой панели _Related_ (например, [this] (http://stackoverflow.com/q/53849/212858) и [this] (http: // stackoverflow. ком/кв/276099/212858)). Вы что-то пробовали и испытываете проблемы с этим? – Useless

+0

http://stackoverflow.com/q/236129/1458030 – qPCR4vir

ответ

1

Похоже, что был избит до удара. Тем не менее: вы можете проверить, что вы правильно сформированы. если так вот пример программа:

#include <iostream> 
#include <sstream> 
#include <vector> 
#include <cassert> 

namespace { 
    std::vector<unsigned int> parse(std::istream &is) { 
    assert(is.get() == 'v'); 
    std::vector<unsigned int> res; 
    while (is.good()) { 
     unsigned int tmp; 
     assert(is.get() == '_'); 
     is >> tmp; 
     res.push_back(tmp); 
    } 
    assert(!is.fail()); 
    return res; 
    } 

    std::vector<unsigned int> parse(const std::string &s) { 
    std::istringstream ss(s); 
    return parse(ss); 
    } 
} 

int main(int, char **) { 
    for (unsigned int i : parse("v_1_23_4")) { 
    std::cout << i << std::endl; 
    } 
    return 0; 
} 

Я использовал утверждение, но вы можете использовать исключение или возвращать значение ошибки. HTH

2

В обратном случае вы должны игнорировать первый символ, а затем извлекать оставшиеся _<value> s в цикле. Вот возможное решение:

vector<unsigned int> generateKey(string key) 
{ 
    stringstream varNames(key); 
    varNames.ignore(); // Ignore the initial v 

    vector<unsigned int> varSet; 
    unsigned int value; 

    // While we can ignore a character and extract an integer, add them 
    // to varSet 
    while (varNames.ignore() && 
     varNames >> value) { 
    varSet.push_back(value); 
    } 

    return varSet; 
} 

Альтернативным решением было бы использовать std::getline, лечение _ в качестве линии разделителя.

Смежные вопросы