back_inserter(容器)的类型是什么?

what is the type of back_inserter(container)

本文关键字:类型 是什么 容器 inserter back      更新时间:2023-10-16

我下面的代码编译,但我不知道如何写这没有使用decltype。我在使用decltype的行下面的注释行中写了我失败的尝试。

#include <iostream>
#include <iterator>
#include <vector>
using namespace std;
template<class Out>
class Fill{
public:
  Fill(){}
  void fill(Out x){
    for(int i = 0; i != 10; i++)*x++ = i;
  }
};
int main(){
  vector<int> v;
  Fill<decltype(back_inserter(v))> f; //works
  //does not work
  //Fill<vector<int>::iterator> g;
  //does not work
  //Fill<back_insert_iterator<vector<int>> h;

  f.fill(back_inserter(v));
  copy(v.begin(),v.end(),ostream_iterator<int>(cout," "));
}

感谢

suresh

类型为back_insert_iterater<vector<int> >。你的第三个例子不工作,因为你需要一个空白之间的">>"。参见http://www.cplusplus.com/reference/std/iterator/back_insert_iterator/,它只是保存一个指向容器类型的指针,并将operator=重新定义为container.push_back。我相信这是为了让std容器可以与std算法一起工作。但是,由于您已经控制了Fill的定义,您可以简单地允许Fill类保存一个容器指针,并直接对容器调用push_back。

vector<int> ints;
typedef back_insert_iterator<vector<int>> InserterType; // This is what you need.
Fill<InserterType> f;
f.fill(back_inserter(ints));
copy(ints.begin(), ints.end(), ostream_iterator<int>(std::cout, "n"));

如果您使用c++0x,答案是:'auto':D

我发现我原来的帖子中的错误是我错过了h定义中的第三个直角括号。应该更正为

Fill<back_insert_iterator<vector<int>>> h;

现在,代码将按预期编译和工作。