我想了解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:这只是一个增加我理解的实验:)
std::vector并std::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)
关联容器(在纯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)