C++ 如何将元素添加到只有迭代器的容器中?

C++ 如何将元素添加到只有迭代器的容器中?,c++,stl,iterator,C++,Stl,Iterator,我有一个带有保留内存的空容器。我的函数(算法)不使用容器,只使用迭代器来开始它。如何在此函数中将元素添加到容器中?我需要分配内存并调用构造函数,但如何在迭代器引用的位置调用构造函数?如果没有指向该容器的引用/指针,则无法将元素插入容器中 但是,您可以覆盖元素(假设您没有常量迭代器)。比如: *it = T(params); 其中T是所讨论的类型。通常使用类似于std::inserter\u迭代器的东西。然而,这通常不会消除对容器的指针或引用的要求——它只是将该引用存储在迭代器本身中 如果您有一

我有一个带有保留内存的空容器。我的函数(算法)不使用容器,只使用迭代器来开始它。如何在此函数中将元素添加到容器中?我需要分配内存并调用构造函数,但如何在迭代器引用的位置调用构造函数?

如果没有指向该容器的引用/指针,则无法将元素插入容器中

但是,您可以覆盖元素(假设您没有
常量迭代器
)。比如:

*it = T(params);

其中
T
是所讨论的类型。

通常使用类似于
std::inserter\u迭代器的东西。然而,这通常不会消除对容器的指针或引用的要求——它只是将该引用存储在迭代器本身中


如果您有一个预设的迭代器类型,这就没有什么好处。如果你有一个像普通算法一样的算法,只需要使用一个迭代器接口插入到集合中,它工作得很好。

C++有一个插入迭代器的概念,这就是我假设你想要的

例如:

#include <iostream>
#include <iterator>
#include <vector>

int main()
{
    int my_array[] = { 1,2,3,4,5,6,7,8,9,10 };
    std::vector<int> my_vector;

    std::copy( std::begin( my_array ),
               std::end( my_array ),
               std::back_inserter( my_vector ) );
}
#包括
#包括
#包括
int main()
{
int my_数组[]={1,2,3,4,5,6,7,8,9,10};
std::vector my_vector;
std::copy(std::begin(my_数组),
std::end(我的_数组),
std::back_插入器(my_向量));
}

您不能更改容器,因为只有遍历迭代器;但是,您可以使用插入迭代器

编辑:
如果您保留内存,您必须知道它将包含多少元素。然后,您可以在传递到函数之前添加空元素,并使用迭代器填充它们,使其递增。之后,您可以返回此迭代器,它将指向有用数据结束的位置。

我不能使用容器!我只有迭代器。@user1290126:看起来好多了
std::copy
不知道有关my_vector的任何信息,它只是传递了一个迭代器,但它仍然会复制到vector中,并在进行扩展时进行扩展。这就是
输出迭代器的神奇之处。这里
std::back\u insert(my\u vector)
创建了一个迭代器,当写入到该向量后,该迭代器将附加到该向量。@user1290126您有什么类型的迭代器?insert_迭代器能够插入数据,因为它知道容器,但是如果您只知道一个普通的forward_迭代器,那么您要问的问题更类似于“如何仅使用指向元素的指针调整数组大小”—答案通常是“您不能”,函数调用方有责任决定使用哪种迭代器,以及该迭代器是否能够修改容器。传递给函数的唯一方法是插入迭代器而不是遍历迭代器吗?除了传递容器引用,是的。遍历迭代器仅用于遍历,不用于修改容器。请注意,当修改容器时,许多迭代器将无效!插入器迭代器必须接受容器。但是它不是由算法执行的。当您创建迭代器时,即在调用函数之前,您将容器馈送到
插入器_迭代器。在这之后,您只需要迭代器。因此,我使用insert_迭代器只向容器添加了一个元素。然后出现了一个错误。插入迭代器应该指向哪里,开始还是结束?我应该增加它吗?@user1290126:通常您使用容器的
后插入迭代器()
前插入迭代器()
(举几个例子)来获取该容器的插入迭代器。请解释为什么您只有迭代器。大多数迭代器不允许您更改容器;您必须有权访问该容器。顺便说一句,迭代器和常量迭代器的区别在于是否可以更改元素,而不是容器。另外,请标记您的问题的正确答案。我想问为什么这是一个要求。这不是个好主意,因为我知道可能的最大元素数,如果容器是关联的,此类空元素可能不会在末尾发生