2012-04-01 71 views
0

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

+0

请解释你为什么只有一个迭代器。大多数迭代器不会让你改变容器;你必须有权访问容器。顺便说一句,迭代器和常量迭代器之间的区别在于是否可以更改元素,而不是容器。 – 2012-04-01 19:19:19

+0

另外,**请标记正确的答案您的问题。** – 2012-04-01 19:19:59

+0

这是一个要求 – user1290126 2012-04-01 19:27:15

回答

4

通常使用类似于std::inserter_iterator的东西。但是,这通常不会消除对容器的指针或引用的需求 - 它只是将该引用存储在迭代器本身内部。

如果你有一个预置的迭代器类型,这没有好处。如果你像普通的算法那样只需要使用一些使用迭代器接口插入到集合中的东西,它就可以很好地工作。

+0

std :: inserter_iterator必须带一个容器。但它不是由算法采取的 – user1290126 2012-04-01 19:00:57

+0

当您创建迭代器时,将容器提供给'inserter_iterator',这是在函数被调用之前。之后,你只需要迭代器。 – 2012-04-01 19:16:52

+0

所以,我只在insert_iterator的容器中添加了一个元素。然后出现一个错误。 insert_iterator应该指向哪里,开始还是结束?我应该增加它吗? – user1290126 2012-04-01 19:33:49

2

如果没有引用/指向该容器的指针,则不能将元素插入到容器中。

但是,您可以覆盖一个元素(假设您没有const_iterator)。例如:

*it = T(params); 

其中T是有问题的类型。

3

C + +有一个insert_iterator的概念,这是我以为你后?

例如:

#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)); 
} 
+0

我不能使用容器!我只有迭代器。 – user1290126 2012-04-01 18:59:48

+2

@ user1290126:看起来更好。 'std :: copy'不知道关于'my_vector'的任何信息,它只是传递一个迭代器,但它仍然会复制到向量中,随着它的发展而扩展它。这是“输出迭代器”的魔力。这里'std :: back_insert(my_vector)'创建一个迭代器,当它被写入时附加到vector上。 – 2012-04-01 19:02:28

+0

@ user1290126你有什么样的迭代器?一个insert_iterator能够插入数据,因为它知道容器,但是如果你得到的只是一个普通的forward_iterator,那么你所问的问题更类似于“我如何仅使用指向一个指针的数组来调整数组元素“ - 答案只是”你不能“ - 通常,函数的调用者负责决定使用哪种类型的迭代器,以及该迭代器是否能够修改容器。 – 2012-04-01 19:04:29

3

你不能改变容器,仅具有横动迭代;不过,您可以改用插入迭代器。

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

+0

不是个好主意,因为我知道可能的最大数量的元素,并且如果容器是关联的,那么这样的空元素可能不会发生在末尾 – user1290126 2012-04-01 19:19:21

相关问题