我发现在将对象插入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 ++中将对象正确插入到矢量中?
最后一个问题是,通过引用或副本在向量中存储的对象是什么?
答案 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
。向量在内部使用数组,因此将值复制到其中。根据需要调整数组的大小(复制和替换)。