STL - 复制混合容器

时间:2011-03-06 19:18:44

标签: c++ stl

我正在尝试了解STL算法。

复制定义为:

template<class InputIterator, class OutputIterator>
  OutputIterator copy ( InputIterator first, InputIterator last, OutputIterator result )

有人可以解释为什么以下情况有效吗? deques是混合的但是当向量和集合混合时失败。

#include <iostream>
#include <algorithm>
#include <vector>
#include <deque>
#include <deque>
#include <set>
using namespace std;

int main () {
  int myints[]={10,20,30,40,50,60,70};
  vector<int> myvector;
  vector<int>::iterator it;

  set<int> mset(myints,myints+8);
  set<int>::iterator setItr = mset.begin();




  deque<int> deq;
  deq.resize(10);
  deque<int>::iterator deqItr = deq.begin();
  myvector.resize(7);   // allocate space for 7 elements
  copy ( myints, myints+7, myvector.begin() );

  copy ( myvector.begin(), myvector.end(), deqItr );
  cout << "deque contains:";
  for (deque<int>::iterator dit=deq.begin(); dit!=deq.end(); ++dit)
    cout << " " << *dit;

  cout << endl;

  //copy ( myvector.begin(), myvector.end(), setItr );


  return 0;
}

我理解vectors / deque有随机访问迭代器,其中set有双向迭代器。我不理解为什么只需要输入/输出迭代器时编译失败。

PS:这只是一个增加我理解的实验:)

3 个答案:

答案 0 :(得分:5)

std::vectorstd::deque可以预先分配空间。 std::set没有。在不预先分配空间的情况下,尝试取消引用传递给copy的迭代器会产生未定义的行为。

显而易见的替代方法是使用插入迭代器 - 但不幸的是,你仍然需要几乎总是使用不同的代码来代替deque或vector:

std::copy(myvector.begin(), myvector.end(), std::back_inserter(mydeque));

std::copy(myvector.begin(), myvector.end(), std::inserter(mySet, mySet.end());

答案 1 :(得分:5)

关联容器(在纯C ++ 03中)是特殊容器,它们始终对元素进行排序,通常实现为红黑树。为了保持顺序不变,set和map迭代器提供对key对象的常量引用,因此你无法修改它。

特别是对于std::set<T>,迭代器通常会std::iterator_traits< std::set<T>::iterator >::referenceconst T&,因此std::copy操作中隐含的赋值将失败。

如果你想要做的是将元素插入到集合中,你可以使用<iterator>标题中的迭代器来执行集合中的insert操作:

std::copy( v.begin(), v.end(), std::inserter( s, s.end() ) ); // s is the set

答案 2 :(得分:0)

它适用于矢量和双端队列,因为您可以预先分配空间。使用其他容器(如map),您需要一个迭代器适配器来为您执行此操作。例如,请查看insert_iterator。