Создание префиксной последовательности в одной строке - PullRequest
3 голосов
/ 16 февраля 2010

С учетом инициализированных переменных unsigned a, unsigned b с b > a и std::vector<std::string> strings размера b-a. Как я могу заполнить strings элементами, например "x3" "x4" "x5" "x6" (в случае a=3 и b=7) для произвольных a и b с одной командой C ++ (что означает одна точка с запятой вообще:) )?

Ответы [ 6 ]

8 голосов
/ 16 февраля 2010

Какой вызов!

while (a < b) strings.push_back('x' + boost::lexical_cast<std::string>(a++));

Кроме того, сравните многословие с ответом Мануэля:)

6 голосов
/ 17 февраля 2010

#define IM_NOT_A_SEMICOLON_REALLY ; затем продолжайте по желанию.

3 голосов
/ 17 февраля 2010

производная ответа UncleBen, но с использованием только STL

while( a < b ) vStrings.push_back( 'x' + ( (std::stringstream&)( std::stringstream() << a++ ) ).str() );
3 голосов
/ 16 февраля 2010

Не слишком сложно ...

std::transform(
    boost::make_counting_iterator(a), boost::make_counting_iterator(b), 
    strings.begin(), 
    "x" + boost::lambda::bind(boost::lexical_cast<std::string, unsigned int>, 
                              boost::lambda::_1));
1 голос
/ 17 февраля 2010

Злоупотребление запятыми, которые явно не являются точками с запятой:

while (a<b) {
   char s[12],
        t = (snprintf(s, 11, "x%d", a++), strings.push_back(s), 0);
}
1 голос
/ 16 февраля 2010
BOOST_FOREACH(std::string & str, strings) str = "x" + boost::lexical_cast<std::string>(a++);
...