В примере с 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;
}
Есть ли более прямой способ реализации этого?
Вы могли бы использовать 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));
std::stringstream ss("1 0 1 0");
std::vector<bool> vec(std::istream_iterator<bool>(ss), {});
Теперь посмотрим на примеры, которые вы разместили, и если вы уверены, что ваш 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;});
Если все, что вам нужно, это один и тот же интерфейс для 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);