C++ 如何将对象插入std::vector?

C++ 如何将对象插入std::vector?,c++,oop,object,stdvector,C++,Oop,Object,Stdvector,我发现在将对象插入std::vector时遇到问题,下面是我尝试执行的示例: //在SomeClass.cpp中 但是,我在尝试编译程序时遇到以下错误: 错误:调用“std::vector::insert(int32\u t&,OtherClass&)”时没有匹配的函数 vectorOtherClass.insert(位置、值) ______________________^ SomeClass.h中的向量定义为: private: std::向量向量其他类; 在C++中,如何正确地将对象插入

我发现在将对象插入std::vector时遇到问题,下面是我尝试执行的示例:

//在SomeClass.cpp中

但是,我在尝试编译程序时遇到以下错误:

错误:调用“std::vector::insert(int32\u t&,OtherClass&)”时没有匹配的函数

vectorOtherClass.insert(位置、值)

______________________^

SomeClass.h中的向量定义为:

private:
std::向量向量其他类;
在C++中,如何正确地将对象插入向量

最后一个问题是,向量中的对象是通过引用还是通过复制存储的?

参考:

您需要传入一个interator,因此使用begin并从那里偏移位置。不需要通过ref传入int,除非函数要更改它们。考虑检查缓冲区溢出。

void SomeClass::addItem(int32_t position, const OtherClass &value)
{
    assert(position < vectorOtherClass.size());
    assert(position >= 0);
    vectorOtherClass.insert(vectorOtherClass.begin()+position, value);
}
void SomeClass::addItem(int32\t位置、const OtherClass和value)
{
断言(position=0);
插入(vectorOtherClass.begin()+位置,值);
}

正如错误所说,没有带int参数的插入函数。见:

single element (1)  
iterator insert (iterator position, const value_type& val);
fill (2)    
    void insert (iterator position, size_type n, const value_type& val);
range (3)   
template <class InputIterator>
    void insert (iterator position, InputIterator first, InputIterator last);
单个元素(1)
迭代器插入(迭代器位置、常量值、类型和值);
填充(2)
无效插入(迭代器位置、大小\u类型n、常量值\u类型&val);
射程(3)
模板
无效插入(迭代器位置,先输入迭代器,后输入迭代器);
你可以在这里找到一个例子

int main()
{
std::vector myvector(3100);
std::vector::it迭代器;
it=myvector.begin();
it=myvector.insert(it,200);
myvector.insert(it,2300);
//“it”不再有效,请获取新的:
it=myvector.begin();
std::另一个载体(2400);
myvector.insert(it+2,另一个vector.begin(),另一个vector.end());
int myarray[]={501502503};
myvector.insert(myvector.begin(),myarray,myarray+3);
std::cout根据,插入方法采用以下参数:

位置

在向量中插入新元素的位置。 迭代器是一种成员类型,定义为指向元素的随机访问迭代器类型

val

要复制(或移动)到插入图元的值。 成员类型value_type是容器中元素的类型,在deque中定义为其第一个模板参数(T)的别名

注意<>代码>位置<代码>不是一个积分值,而是迭代器。C++使用迭代器很多,因为当有一个操作时,很多操作都是相当有效的。 特别是,您可以添加向量迭代器和数字以使迭代器处于正确位置,因此您可以执行以下操作:

vectorOtherClass.insert(vectorOtherClass.begin() + position, value);

这不适用于其他容器,如
std::list
。此外,您应该确保检查
位置是否在向量的范围内(
0请注意,如果
position
超出范围,这是一种未定义的行为,因此最好同时检查
position>=0
position@M.M这两个参数。我已经指出了这一点,但没有明确地说“考虑检查缓冲区溢出”。我现在添加的断言非常清楚。我现在意识到我误解了c++中的向量。另一个疑问是,当使用它+2时,是否在向量的第二个位置进行插入?是的,例如:std::vector myvector(3100);std::vector::iterator it;it=myvector.begin();/*out:100/it=myvector.insert(it,200);/out:200 100/it=myvector.insert(it+2500);/out:200 100 500*/据我对@jsn的评论所知,当使用“vector::insert()”时,向量会增长,但是在你的帖子中,我理解到向量不会使用“vector::insert()”增长2个不同的东西,你应该考虑向量:大小和容量。大小代表存储在容器中的元素的数量,即大小为5的int向量有5个int。容量与向量的内部表示有关;向量可能有大小5和容量10,这意味着没有新的全部。除非我们添加至少6个新元素,否则需要进行定位。此时,向量将扩展其容量以容纳新元素,并加上额外的空间总和,以避免将来可能的重新分配。简言之,insert总是增加大小,但有时只会增加容量。
single element (1)  
iterator insert (iterator position, const value_type& val);
fill (2)    
    void insert (iterator position, size_type n, const value_type& val);
range (3)   
template <class InputIterator>
    void insert (iterator position, InputIterator first, InputIterator last);
int main ()
{
  std::vector<int> myvector (3,100);
  std::vector<int>::iterator it;

  it = myvector.begin();
  it = myvector.insert ( it , 200 );

  myvector.insert (it,2,300);

  // "it" no longer valid, get a new one:
  it = myvector.begin();

  std::vector<int> anothervector (2,400);
  myvector.insert (it+2,anothervector.begin(),anothervector.end());

  int myarray [] = { 501,502,503 };
  myvector.insert (myvector.begin(), myarray, myarray+3);

  std::cout << "myvector contains:";
  for (it=myvector.begin(); it<myvector.end(); it++)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}
vectorOtherClass.insert(vectorOtherClass.begin() + position, value);