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

时间:2017-11-05 23:00:26

标签: c++ oop object stdvector

我发现在将对象插入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 ++中将对象正确插入到矢量中?

最后一个问题是,通过引用或副本在向量中存储的对象是什么?

3 个答案:

答案 0 :(得分:1)

与错误一样,没有带int参数的insert函数。参见:

#include <iostream>
#include "Date.h"
using namespace std;

Date::Date():day(1), month(1), year(1990){
}

Date::Date(int day, int month, int year){
this->day = dayTest(day);
this->month = monthTest(month);
this->year = yearTest(year);
}

void Date::setDay(int day){

this->day = dayTest(day);
}

void Date::setMonth(int month){

this->month = monthTest(month);
}

void Date::setYear(int year){
this->year = yearTest(year);
}

int Date::dayTest(int day){
const int totalDaysInMonths[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 
31, 30, 31};
if(day > 0 && day <= totalDaysInMonths[month])
        return day;
if(month == 2 && day == 29 && ((year % 4 == 0 && year % 100 != 0) || year % 
400 ==0))
        return day;
else
    return 1;
}

int Date::monthTest(int month){
if(month > 0 && month <= 12){
    return month;
}else{
    return 1;
}
}

int Date::yearTest(int year){
if(year >= 1900 && year <= 2050){
    return year;
}else{
    return 1990;
}
}

void Date::printDate()const{
cout << day << "/" << month << "/" << year;
}

您可以在http://www.cplusplus.com/reference/vector/vector/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);

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

  

position

     

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

     

val

     

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

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

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

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

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

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