2016-03-31 5 views
9

В C++ 11,Как создать вектор, как список понимания

vector<string> blockPathList; 
for(int i = 0; i < blockNum; i++) 
{ 
    blockPathList.push_back(desPath + "part" + to_string(i)); 
} 

Можно ли переписать код, приведенный выше список, как постижение, или короче и более кратким?

+1

Что такое 'blockNum' и' desPath'? –

+1

Похоже, вы превращаете 1 тип списка (вектор) в другой. Это похоже на работу для функции «map», которую я уверен, что C++ имеет. – Carcigenicate

+0

@VincentSavard 'blockNum' - это просто int, а' desPath' - 'string' – chenzhongpu

ответ

6

Вы хотите использовать сторонние библиотеки? Эрик Niebler-х range-v3 позволяет:

std::vector<string> blockPathList = 
     view::ints(0, blockNum) 
     | view::transform([&desPath](int i) { 
      return desPath + "part" + std::to_string(i); 
     }); 

Это примерно как функциональный список постижение-у, как вы собираетесь попасть в C++.

+7

Вы ошибались, он просил более коротких :) – Rotem

+2

@Rotem OP просил понять список. – Barry

+2

Это одно непонятное понимание списка, но она * сделала * прошу об этом. – Quentin

3

не очень тоже, но должны также получить работу:

int cur = 0; 
std::vector<std::string> blockPathList(blockNum); 
std::generate(blockPathList.begin(), blockPathList.end(), 
     [&](){ return destPath + "part" + std::to_string(cur++); }); 

К сожалению, это

  • Требуется вектор быть предварительно размером
  • Требуется внешнюю переменную итерации (поскольку std::generateGenerator не принимает никаких аргументов

Вы можете также использовать std::for_each:

std::vector<int> nums(blockNum); 
std::iota(nums.begin(), nums.end(), 0); 
std::for_each(nums.begin(), nums.end(), [&](int c) { 
     blockPathList.push_back(destPath + "part" + std::to_string(c)); 
     }); 

но опять-таки это изуродованный, потому что std::iota не генерирует диапазоны. Он заполняет существующий диапазон итератором, а не действует как числовой итератор в себе (конечно, вы можете решить это путем реализации или использования чего-то, что генерирует эти итераторы)

+3

Вам не нужно предварительно форматировать вектор, если вы используете 'generate_n' (C++ 11) и' back_inserter'. –