back_inserter(容器)的类型是什么

时间:2011-08-24 02:34:56

标签: c++ types

我的以下代码编译但我不知道如何在不使用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," "));
}

由于

苏雷什

4 个答案:

答案 0 :(得分:2)

类型为back_insert_iterater<vector<int> >。您的第3个示例不起作用,因为您需要“&gt;&gt;”之间的空格。请参阅http://www.cplusplus.com/reference/std/iterator/back_insert_iterator/,它只是包含指向容器类型的指针,并重新定义operator =为container.push_back。我相信这是存在的,以便std容器可以使用std算法。但是,由于您已将控件定义控制为Fill,您可以简单地允许Fill类保存容器指针并直接针对容器调用push_back。

答案 1 :(得分:2)

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"));

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

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