Ale*_*nov 5 c++ boost iterator
我有一个遗留函数Foo,它接受两个迭代器作为输入,我想重用它,但不应该更改它的接口(虽然我可以更改迭代器的类型,但不能使其成为模板)
问题是我有不同类型的迭代器并且必须复制初始容器以获取Foo函数所需的迭代器
我想知道是否有任何方法可以将一种类型的迭代器转换为另一种类型的迭代器?
我尝试使用,boost::make_transform_iterator但它不会编译,说迭代器属于不同类型
是否可以取消注释并使用option 2(参见下面的代码)?
#include <algorithm>
#include <iostream>
#include <vector>
#include <iterator>
#include <numeric>
#include <boost/iterator/transform_iterator.hpp>
/* Method with fixed interface */
void Foo(std::vector<int>::const_iterator beginIt, std::vector<int>::const_iterator endIt)
{
std::cout << "ints:" << std::endl;
std::copy(beginIt, endIt, std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
}
int main()
{
const std::vector<std::string> strings { "2", "4", "6" };
auto convertStringToInt = [](const std::string & s) { return std::stoi(s); };
// 1) Works, but creates another container with size of initial container
std::vector<int> convertedInts;
std::transform(strings.begin(), strings.end(), std::back_inserter(convertedInts), convertStringToInt);
Foo(convertedInts.begin(), convertedInts.end());
// 2) Doesn't compile, but operates only with iterators hence there's minimum overhead
//auto beg = boost::make_transform_iterator(strings.begin(), convertStringToInt);
//auto end = boost::make_transform_iterator(strings.end(), convertStringToInt);
//Foo(beg, end);
std::cout << "strings:" << std::endl;
std::copy(strings.begin(), strings.end(), std::ostream_iterator<std::string>(std::cout, " "));
}
Run Code Online (Sandbox Code Playgroud)
该代码可以在在线编译器wandbox中编译(它没有“共享”功能)
编辑: Foo实现严格特定于 的逻辑int,因此不可能使其通用。但我有一个容器(std::string如示例中的 s )元素,我可以通过非捕获 lambda 将其中的元素转换为整数。
没有标准方法可以将一个迭代器包装到另一个迭代器中,这似乎很奇怪:)