std::transform 和 std::istream_iterator
std::transform with std::istream_iterator
假设我有一个字符串,其中包含由空格分隔的数字。我想将数字插入一个整数向量中,其中每个数字都减一。例如:
"1 2 3 4" -> {0, 1, 2, 3}
现在的计划是将 std::transform
与 std::istream_iterator<int>
结合使用,如下所示:
std::istringstream source{"1 2 3 4"};
std::vector<int> target;
std::transform(std::istream_iterator<int>(source),
std::istream_iterator<int>(),
std::begin(target),
[](int a) {
return a-1;
}
);
不幸的是,这不起作用,因为 std::transform
预计 target
已经是正确的大小。所以我必须做
std::vector<int> target(4);
现在我有两个问题。我怎样才能预先动态找到 target
的正确尺寸?有没有更优雅的方式来实现实际目标?
在研究这个问题时,我找到了一个简单的解决方案。只需使用 std::back_inserter
作为输出迭代器而不是 std::begin(target)
.
std::transform(std::istream_iterator<int>(source),
std::istream_iterator<int>(),
std::back_inserter(target),
[](int a) {
return a-1;
}
);
另一个solution使用std::for_each
:
std::for_each(std::istream_iterator<int>(source),
std::istream_iterator<int>(),
[&target](int a) {
target.push_back(a-1);
}
);
假设我有一个字符串,其中包含由空格分隔的数字。我想将数字插入一个整数向量中,其中每个数字都减一。例如:
"1 2 3 4" -> {0, 1, 2, 3}
现在的计划是将 std::transform
与 std::istream_iterator<int>
结合使用,如下所示:
std::istringstream source{"1 2 3 4"};
std::vector<int> target;
std::transform(std::istream_iterator<int>(source),
std::istream_iterator<int>(),
std::begin(target),
[](int a) {
return a-1;
}
);
不幸的是,这不起作用,因为 std::transform
预计 target
已经是正确的大小。所以我必须做
std::vector<int> target(4);
现在我有两个问题。我怎样才能预先动态找到 target
的正确尺寸?有没有更优雅的方式来实现实际目标?
在研究这个问题时,我找到了一个简单的解决方案。只需使用 std::back_inserter
作为输出迭代器而不是 std::begin(target)
.
std::transform(std::istream_iterator<int>(source),
std::istream_iterator<int>(),
std::back_inserter(target),
[](int a) {
return a-1;
}
);
另一个solution使用std::for_each
:
std::for_each(std::istream_iterator<int>(source),
std::istream_iterator<int>(),
[&target](int a) {
target.push_back(a-1);
}
);