在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;
}
有更直接的方法来实现这个吗?
答案 0 :(得分:5)
如果您想要使用整个流,可以使用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
的尺寸合适,可以使用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;});
答案 1 :(得分:0)
如果您想要的是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);