2016-07-19 1 views
0

Как я могу заполнить C++ вектор пар из массива строк, следующих за строкой следующего формата: «a: b», «c: d», «e: f» Например: string a [] = { "6: 7", "3: 5", "5: 2"}; конвертировать его в векторный> и пару содержимого с 6 и 7, затем 3 и 5 ...Как я могу заполнить C++ вектор пар из массива строк с форматом «a: b»?

Мне не удалось с boost :: lexical_cast или с strtol, возможно, для использования регулярных выражений? любая другая идея?

Thx

+2

Да, вы можете использовать регулярное выражение. – user2079303

+1

Это зависит от того, нужно ли вам подтвердить свой ввод. Если да, то регулярное выражение будет хорошим выбором - «(\\ d +): (\\ d +)" – Slava

ответ

7

Самый простой способ, вероятно, использовать stringstream для обработки преобразования:

std::pair<int, int> cvt(std::string const &in) { 
    std::stringstream buff(in); 
    std::pair<int, int> ret; 
    buff >> ret.first >> std::ignore(1) >> ret.second; 
    return ret; 
} 

Если входы могут быть что-то другое, чем цифры, вы можете очень легко держать их как строки, с что-то вроде:

std::pair<std::string, std::string> cvt(std::string const &in) { 
    std::stringstream buff(in); 
    std::pair<std::string, std::string> ret; 
    std::getline(buff, ret.first, ':'); 
    std::getline(buff, ret.second); 
    return ret; 
} 

Затем вы можете применить это ко всему массиву ввода с std::transform:

std::vector<std::pair<int, int> > pairs; // or std::pair<std::string, std::string> 

std::transform(std::begin(a), std::end(a), std::back_inserter(pairs), cvt); 
4

насчет

using int_pair = std::pair<int, int>; 
std::string input_array[] = { "12:000", "55:22" }; 
std::vector<int_pair> pair_vector; 
std::transform(std::cbegin(input_array), std::cend(input_array), 
    std::back_inserter(pair_vector), [](std::string const& str) 
     -> int_pair { 
     auto const& it = std::find(str.cbegin(), str.cend(), ':'); 
     return std::make_pair(std::stoi(std::string(str.begin(), it)), std::stoi(std::string(it+1, str.cend()))); 
}); 

// Let's display the results 
for (auto const& pair : pair_vector) { 
    std::cout << "First = " << pair.first << ", Second = " << pair.second << '\n'; 
} 

Этот выход будет:

Первый = 12, вторая = 0
Первая = 55, второй = 22

Как показано live

+0

Я знаю людей, которые говорят, что C++ 11 - это как новый язык. Когда я вижу такие функции, как это, я им верю. – Matt

+0

@JerryCoffin Я не понимаю – Rerito

+0

@JerryCoffin Oh! Отредактировал мой ответ, чтобы отразить ваши комментарии (и придерживаться ввода OP) – Rerito

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