也许我错过了一些完全明显的东西,但我无法弄清楚为什么会使用back_inserter / front_inserter / inserter, 而不是仅从容器接口提供适当的迭代器。 这就是我的问题。
答案 0 :(得分:4)
因为那些调用push_back,push_front和insert的容器的“普通”迭代器不能(或者,至少不会)。
示例:
int main() {
using namespace std;
vector<int> a (3, 42), b;
copy(a.begin(), a.end(), back_inserter(b));
copy(b.rbegin(), b.rend(), ostream_iterator<int>(cout, ", "));
return 0;
}
答案 1 :(得分:2)
主要原因是常规迭代器迭代容器中的现有元素,而* inserter系列迭代器实际上在容器中插入新元素。
std::vector<int> v(3); // { 0, 0, 0 }
int array[] = { 1, 2, 3 };
std::copy( array, array+3, std::back_inserter(v) ); // adds 3 elements
// v = { 0, 0, 0, 1, 2, 3 }
std::copy( array, array+3, v.begin() ); // overwrites 3 elements
// v = { 1, 2, 3, 1, 2, 3 }
int array2[] = { 4, 5, 6 };
std::copy( array2, array2+3, std::inserter(v, v.begin()) );
// v = { 4, 5, 6, 1, 2, 3, 1, 2, 3 }
答案 2 :(得分:0)
迭代器指向一个元素,一般不知道它附加到哪个容器。 (迭代器基于指针,你无法从指针告诉它与之相关的数据结构。)
向STL容器添加元素会更改容器的描述。例如,STL容器具有.size()
功能,必须更改。由于某些元数据必须更改,因此无论是什么插入新元素都必须知道它添加到哪个容器。
答案 3 :(得分:0)
这完全取决于你真正需要什么。根据您的意图,可以使用这两种迭代器。
当您使用“普通”迭代器时,它不会在容器中创建新元素。它只是将数据一个接一个地写入容器的现有连续元素中。它会覆盖容器中已有的任何数据。如果允许它到达序列的末尾,则任何进一步的写入都会使其“脱离结束”并导致未定义的行为。即它崩溃了。
另一方面,插入器迭代器创建一个新元素,并在每次通过它们写入内容时将其插入当前位置(正面,背面,中间某处)。它们从不覆盖现有元素,而是添加新元素。