【问题标题】:How to insert objects into std::vector?如何将对象插入 std::vector?
【发布时间】:2017-11-05 23:00:26
【问题描述】:

按照我正在尝试做的示例,我发现将对象插入 std::vector 时遇到问题:

//在 SomeClass.cpp 中

void SomeClass::addItem(int32_t &position, OtherClass &value)
{
    vectorOtherClass.insert(position,valvalue);
}

但是在尝试编译程序时出现以下错误:

错误:没有匹配函数调用'std::vector::insert(int32_t&, OtherClass&)'

vectorOtherClass.insert(位置,值);

____________^

SomeClass.h中的向量定义为:

private:
    std::vector<OtherClass> vectorOtherClass;

如何正确地将对象插入到 C++ 中的向量中?

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

【问题讨论】:

    标签: c++ oop object stdvector


    【解决方案1】:

    正如错误所说,没有带有 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);
    

    你可以在这里找到一个例子http://www.cplusplus.com/reference/vector/vector/insert/

    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;
    }
    

    【讨论】:

    • 我现在意识到我误解了 c++ 中的向量。另一个疑问,当你使用它+2时,你是在向量的第二个位置进行插入吗?
    • 是的,例如:std::vector myvector (3,100); std::vector::iterator it;它 = myvector.begin(); /* out: 100 100 100 / it = myvector.insert ( it , 200 ); / out: 200 100 100 100 / it = myvector.insert ( it+2 , 500 ); / 出:200 100 500 100 100 */
    【解决方案2】:

    根据the method's reference,insert方法接受以下参数:

    position

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

    val

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

    注意position 不是一个整数值,而是一个迭代器。 C++ 经常使用迭代器,因为当你拥有一个迭代器时,许多操作都相当高效。

    特别是,您可以添加向量迭代器和数字以使迭代器位于正确的位置,因此您可以执行以下操作:

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

    这不适用于其他容器,例如std::list。此外,您应该确保检查 position 是否在向量的范围内 (0 &lt;= position &lt; vectorOtherClass.size())。理想情况下,position 应该是无符号的以确保下限。


    最后,元素作为副本添加到std::vectors。向量在内部使用数组,因此值被复制到其中。数组会根据需要调整大小(复制和替换)。

    【讨论】:

    • 据我了解@jsn 的评论,当使用“vector::insert()”向量时,向量会增长,但是通过你的帖子,我了解到向量不会增长使用“vector::insert()”,正确的结果是什么?
    • 关于向量,您应该考虑两件不同的事情:大小和容量。 Size 表示存储在容器中的元素数量,即大小为 5 的 int 向量有 5 个 int。容量与向量的内部表示有关;向量的大小可能为 5,容量为 10,这意味着除非我们添加至少 6 个新元素,否则不需要新的分配。此时,向量会扩展其容量以容纳新元素,并加上额外的空间以避免未来的重新分配(如果可能)。简而言之,插入总是会增加大小,但只是有时会增加容量。
    【解决方案3】:

    参考:http://en.cppreference.com/w/cpp/container/vector/insert

    你需要传入一个交互器,所以使用 begin 并从那里偏移位置。 除非您的函数要更改它们,否则无需通过 ref 传入整数。 考虑检查缓冲区溢出。

    void SomeClass::addItem(int32_t position, const OtherClass &value)
    {
        assert(position < vectorOtherClass.size());
        assert(position >= 0);
        vectorOtherClass.insert(vectorOtherClass.begin()+position, value);
    }
    

    【讨论】:

    • 请注意,如果position 越界,这是未定义的行为,因此最好同时检查position &gt;= 0position &lt;= vectorOtherClass.size()
    • @M.M 好点。我做到了,但没有明确地说“考虑检查缓冲区溢出”。我现在添加了断言非常清楚。
    猜你喜欢
    • 1970-01-01
    • 2019-05-07
    • 2013-08-18
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 2019-05-22
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多