【问题标题】:Wrapper for vector::insert functionvector::insert 函数的包装器
【发布时间】:2015-06-20 22:21:02
【问题描述】:

我正在为std::vector 类做一个小包装。我不使用模板:我的向量声明为std::vector<int>。现在我需要一个 insert 函数的包装器,但我不知道参数有哪些类型。我试过这个:

std::vector<int>::iterator insert(std::vector<int>::const_iterator position, std::vector<int>::iterator first, std::vector<int>::iterator last) {
    prepare_to_changing();
    data_->vector_.insert(position, first, last);
}

这就是我调用这个函数的方式:

insert(this->nums_.end(), tmp.nums_.begin() + this->nums_.size(), tmp.nums_.end());

nums_std::vector&lt;int&gt;

但是编译器说firstlast 并且返回类型不正确。我应该使用哪个?

【问题讨论】:

  • 你应该展示你如何调用函数插入和这个函数定义,函数声明很好。
  • 谢谢你的回答,我已经解决了。

标签: c++ vector insert iterator


【解决方案1】:

插入如下:

template <class InputIterator>
void insert (iterator position, InputIterator first, InputIterator last);

测试程序:

#include <vector>
#include <iostream>
using namespace std;

class Vector
{
private:
    vector<int> vec;
public:
    void insert(vector<int>::const_iterator position, vector<int>::iterator first, vector<int>::iterator last)
    {
        vec.insert(position, first, last);
    }
    void print()
    {
        for (int i = 0; i < vec.size(); i++)
            cout << vec.at(i) << " ";
        cout << endl;
    }
    vector<int>::const_iterator begin()
    {
        return vec.begin();
    }
    vector<int>::const_iterator end()
    {
        return vec.end();
    }
};
int main()
{
    Vector obj;
    vector<int> vec;
    vec.push_back(1);
    vec.push_back(2);

    obj.insert(obj.begin(), vec.begin(), vec.end());
    obj.print();

    return 0;
}

【讨论】:

  • 编译器在第 12 行显示错误:no matching member function for call to 'insert'。它还说note: candidate function [with _InputIterator = __gnu_cxx::__normal_iterator&lt;int *, std::vector&lt;int, std::allocator&lt;int&gt; &gt; &gt;] not viable: no known conversion from '__normal_iterator&lt;const_pointer, [...]&gt;' to '__normal_iterator&lt;pointer, [...]&gt;' for 1st argument
  • 对我来说运行良好(VC++)。我注意到这不适用于 gcc。从我收到的错误中,我没有看到上面定义的 vector::insert 的任何签名。在我看来这个版本没有实现。
【解决方案2】:
  template <class InputIterator>
        void insert (iterator position, InputIterator first, InputIterator last);

因此,将插入函数的返回类型更改为 void,因为您没有返回任何内容:

void insert(std::vector<int>::iterator position, std::vector<int>::iterator first, std::vector<int>::iterator last) {
    prepare_to_changing();
    data_->vector_.insert(position, first, last);
}

【讨论】:

  • 但是thistmp是不同的对象,所以不代表nums_.end(),其实我不明白你说的是哪个nums_
  • 现在是error: no viable conversion from '__wrap_iter&lt;const_pointer&gt;' to '__wrap_iter&lt;pointer&gt;'
猜你喜欢
  • 1970-01-01
  • 2014-12-05
  • 2021-02-27
  • 2022-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-06
相关资源
最近更新 更多