我已经实现了我的版本
unique_copy
并且它起作用。问题是我必须这样称呼它:
my_unique_copy(
in.begin(), // ok
in.end(), // ok
out.begin(), // ok
equals<Container::iterator> // <--sucks
);
我不喜欢的是equals函数
equals<Container::iterator>
必须用显式实例化
Container::iterator
。我认为类型可以从
in.begin()
,类型为
容器::迭代器
.我试图申报
equals
像
bool()(Iterator,Iterator)
在函数原型中,但错误地失败了。
../untitled2/main.cpp:20:32: error: 'parameter' declared as function returning a function
bool()(Iterator,Iterator) equals){
^
../untitled2/main.cpp:20:34: error: expected ')' before 'equals'
bool()(Iterator,Iterator) equals){
^
../untitled2/main.cpp:20:34: error: expected initializer before 'equals'
../untitled2/main.cpp: In function 'int main()':
../untitled2/main.cpp:41:79: error: 'my_unique_copy' was not declared in this scope
my_unique_copy(in.begin(),in.end(),out.begin(),equals<Container::iterator>);
^
这是代码:
template <typename Iterator>
bool equals(Iterator fst, Iterator snd){
return *fst==*snd;
}
bool myfunction (int i, int j) {
return (i==j);
}
template <typename Iterator, typename Comparator>
void my_unique_copy(Iterator begin,
Iterator end,
Iterator out_begin,
Comparator equals){
if (begin==end){
return;
}
*out_begin=*begin;
++begin;
while (begin!=end){
if (!equals(out_begin, begin)){
*(++out_begin)=*begin;
}
++begin;
}
}
int main(){
using Container = vector<int>;
Container in{1,2,2,3};
Container out(4);
my_unique_copy(in.begin(),in.end(),out.begin(),equals<Container::iterator>);
for_each(out.begin(), out.end(), [](int v){cout<<v<<" ";});
cout<<endl;
unique_copy(in.begin(),in.end(),out.begin(),myfunction);
for_each(out.begin(), out.end(), [](int v){cout<<v<<" ";});
}
这就是我想要的:
my_unique_copy(in.begin(), in.end(), out.begin(), equals);