Как установить диапазон элементов вектора STL для конкретного значения? - PullRequest
14 голосов
/ 16 июля 2009

У меня есть вектор логических значений. Мне нужно установить его элементы с n-го по m-й до true. Есть ли элегантный способ сделать это без использования цикла?

Редактировать: Спасибо всем, кто указал на проблемы с использованием vector<bool>. Однако я искал более общее решение, подобное тому, которое дал Джалф.

Ответы [ 3 ]

42 голосов
/ 16 июля 2009

std::fill или std::fill_n в заголовке algorithm должны помочь.

 // set m elements, starting from myvec.begin() + n to true
std::fill_n(myvec.begin() + n, m, true);

// set all elements between myvec.begin() + n and myvec.begin() + n + m to true
std::fill(myvec.begin() + n, myvec.begin() + n + m, true); 
5 голосов
/ 16 июля 2009

Вектор бул. Посылает дрожь по моему позвоночнику.

Вы смотрели на: std :: bitset (для наборов флагов фиксированного размера) boost :: dynamic_bitset (для наборов флагов динамического размера)

Установить 8 младших битов подряд:

#include <bitset>
#include <iostream>


int main()
{
    std::bitset<12>      flags;
    flags   |= 0x0FF;

    std::cout << flags;
}  
3 голосов
/ 16 июля 2009

Не в меру моих знаний. Вы можете попробовать использовать один из алгоритмов, таких как std :: for_each, std :: replace или std :: fill, чтобы скрыть тот факт, что вы перебираете диапазон элементов, но зацикливаетесь.

Учитывая, что вы сказали, что используете вектор логических значений - если вы используете специализацию std :: vector, вы можете прочитать раздел "Что насчет bool" в этой статьи Херба Саттера * 1004? *.

...