Как вы используете оператор извлечения (& gt; & gt;) с вектором & lt; bool & gt ;?

В примере с vector<int> someVector а также istringstream someStringStream вы можете сделать это:

for (int i=0; i < someVector.size(); i++) {
someStringStream >> someVector[i];
}

я знаю это vector<bool> является эффективной реализацией, и operator[] возвращает ссылочный объект.
Для этого кода я должен использовать индекс, а не итератор, в основном для удобства чтения.
В настоящее время я использую это:

for (int i=0; i < someVector.size(); i++) {
bool temp;
someStringStream >> temp;
someVector[i] = temp;
}

Есть ли более прямой способ реализации этого?

7

Решение

Вы могли бы использовать std::copy или std::vector конструктор диапазона, если вы хотите использовать весь поток:

std::stringstream ss("1 0 1 0");
std::vector<bool> vec;
std::copy(std::istream_iterator<bool>(ss), {}, std::back_inserter(vec));

LIVE DEMO

std::stringstream ss("1 0 1 0");
std::vector<bool> vec(std::istream_iterator<bool>(ss), {});

LIVE DEMO

Теперь посмотрим на примеры, которые вы разместили, и если вы уверены, что ваш std::vectorразмер s правильный, вы могли бы использовать std::generate как пример ниже:

std::stringstream ss("1 0 1 0");
std::vector<bool> vec(4);
std::generate(std::begin(vec), std::end(vec), [&ss](){ bool val; ss >> val; return val;});

LIVE DEMO

5

Другие решения

Если все, что вам нужно, это один и тот же интерфейс для bool и других типов, это легко обернуть.

template <typename T>
T read(std::istream& stream)
{
T value;
stream >> value; // TODO: guard against failure of extraction, e.g. throw an exception.
return value;
}

Однако использование этого напрямую требует указания типа.

for (int i=0; i < someIntVector.size(); i++)
{
someIntVector[i] = read<int>(someStringStream);
}

for (int i=0; i < someBoolVector.size(); i++)
{
someBoolVector[i] = read<bool>(someStringStream);
}

Если вы повторно используете это для нескольких различных векторов, просто оберните это снова:

template <typename T, typename A>
void fillVectorFromStream(std::istream& stream, std::vector<T, A>& vector)
{
for ( int i = 0; i < vector.size(); ++i )
{
vector[i] = read<T>(stream);
}
}

Следовательно, использование просто становится

fillVectorFromStream(streamOfBool, vectorOfBooleanValues);
fillVectorFromStream(streamOfIntegers, vectorOfIntegers);
0

По вопросам рекламы [email protected]