STL - 复制混合容器

Ric*_*o M 2 c++ stl

我想了解STL算法.

复制定义为:

template<class InputIterator, class OutputIterator>
  OutputIterator copy ( InputIterator first, InputIterator last, OutputIterator result )
Run Code Online (Sandbox Code Playgroud)

可以请一些人解释为什么当矢量和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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Jer*_*fin 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());
Run Code Online (Sandbox Code Playgroud)


Dav*_*eas 5

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

特别是用于std::set<T>,迭代器通常是这样的,std::iterator_traits< std::set<T>::iterator >::reference就是const T&,这样的分配在隐式std::copy操作将失败.

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

std::copy( v.begin(), v.end(), std::inserter( s, s.end() ) ); // s is the set
Run Code Online (Sandbox Code Playgroud)