如何使用分配器用于 std::vector
How to use allocator for std::vector?
我并没有真正获得模板 std::vector 的字段,第一个指定类型,例如类,但我没有得到分配器、指针和引用变量。
我将提供一个简单的示例,我想使用类 person 的向量,所以我不得不对模板向量说:嘿,存储我一些人的,但我也必须告诉向量如何分配该类。 (1)该示例的正确语法如何?
一些代码开始:
旁注,在人的构造函数中,C(2)我应该使用 date* 吗?
class date
{
public:
int m_nMonth;
int m_nDay;
int m_nYear;
int getMonth(return m_nMonth;)
int getDay(return m_nDay;)
int getYear(return m_nYear;)
void setDate(int month, int day, int year)
{
m_nMonth=month;
m_nDay=day;
m_nYear=year;
}
date()
{
setDate(0,0,0);
}
date(int month, int day, int year)
{
setDate(month,day,year);
}
void printDate()
{
printf("%d/%d/%d", m_nMonth, m_nDay, m_nYear);
}
}
class person
{
public:
int m_nID;
char m_sName[128];
char m_sSurname[128];
date m_cBirthDay;
void setName(const char* name)
{
strncpy(m_sName, name, 127);
m_sName[127]= ' ';
}
void setSurname(const char* surname)
{
strncpy(m_sSurname, surname, 127);
m_sName[127]= ' ';
}
void setBirthDay(date* bday);
{
m_cBirthDay.date(bday.getMonth(), bday.getDay(), bday.getYear)
}
person(int id, const char* name, const char* surname, date bday)/*should it be date* bday? why?*/
{
m_nID=id;
setName(name);
setSurname(surname);
setBirthDay(bday);
}
}
我想你必须在类人中声明一个函数,称为分配器,这是当你调用时作为第二个参数传递的,(3)如何定义分配器函数?
vector <person*, /*some allocator call*/> ImAVector;
然后,(4)我如何在向量中推送某些东西,(5)这行得通吗?
person* someperson;
someperson.person(/*arguments*/);
ImAVector.push_back(someperson);
(6)如何检索指向特定实例的指针?(7)我可以使用迭代器做这样的事情吗?
//(6)
person* = ImAVector[someIterator];
//and then (7)
ImAVector[someIterator].setName(someConstCharPointer);
string* something = person.getName();
另外,(8)分配器与构造函数有什么关系吗?(9)在分配类实例后立即填写类字段的常见过程是什么?(10)分配器可以调用构造函数吗?
最后一个问题:(11)什么是参考字段、指针字段及其常量对应项?
我知道要写的东西很多,但是我花了最后两天的时间寻找示例但没有成功,所以如果有人对这个很少讨论的话题有所了解,那就太好了,我列举了所有问题以便于回答。
我很感激任何答案:)
该示例的正确语法如何?
除非您有充分的理由存储指针,否则不要这样做。然后你只需声明
std::vector<person> people;
// In C++11, you can create people in place
people.emplace_back(id, name, surname, birthday);
// Historically, you had to create a person and copy it in
people.push_back(person(id, name, surname, birthday));
并且所有分配都为您管理。
需要指针的原因包括:
- 向量不应该管理对象。在这种情况下,您无需告诉向量如何分配它们。
- 也许
person
是一个基类,并且您想要存储各种不同的子类型。
在这种情况下,我认为你不能使用分配器来提供帮助;相反,你可以存储智能指针,以便在从容器中删除指针时自动删除对象:
std::vector<std::unique_ptr<person>> people;
people.push_back(std::unique_ptr<person>(new person(id, name, surname, birthday)));
另一种方法是处理原始指针并尝试在正确的时间删除对象;但生命太短暂了,不能胡说八道。
(2)我应该使用
date*
吗?
不。对于大型或复杂的类,传递const
引用可能是有益的,const date&
;但是这个类很简单,可以按值传递。传递指针会很奇怪,除了在像 C 这样的语言中,这是通过引用传递的唯一方法。
如何检索指向特定实例的指针?
people[index]
提供对该索引的人员的引用(而不是指针)。如果出于某种原因确实想要指针,请使用&
获取地址:
person & ref = people[index];
person * ptr = &ref;
我可以使用迭代器来做这样的事情吗?
不,[]
用于数组索引访问,而不是取消引用迭代器。如果你有一个迭代器it
,那么*it
会给你一个对对象的引用。
分配器与构造函数有什么关系吗?
否,如果您有特殊的内存管理要求,并且不希望向量只是在堆上分配内存,则使用分配器。有使用是相当罕见的。
在分配类的实例后立即填充类字段的常见过程
初始化构造函数中的所有数据成员是很常见的,是的。
类型之外,不需要指定任何其他内容。
vector<person> people;
people.emplace_back(/* constructor arguments for a person */); // constructs the person in place instead of copying into the vector.
person p;
p.stuff();
vector.push_back(p); // copies p into the vector
基本上,分配器和其他字段的默认值已经足够好了,除非您有理由覆盖默认行为,否则无需指定它们。我从来没有理由这样做。
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- 字符串化递归的"std::vector<std::vector<...>>"而不使用部分模板函数专用化
- 连接和压缩标准::vector<std::字符串的最佳方法>
- C++从 std::vector<std::function<中删除 std::function>>
- 如何在构造函数初始值设定项列表中使用 n 个元素初始化 std::vector<std::time_t>
- 如何使用 CUDA 将 std::vector<std::string> 复制到 GPU 设备
- 编译错误 std::vector<std::shared_ptr<T>>迭代器和擦除方法
- 将 std::vector<std::unique_ptr<T>> 移动到 std::vector<std::shared_ptr<T>>
- 如何从 boost::container::vector<std::string>::iterator 访问索引和对象?
- 使用 std::vector<std::future<int>> 和 std::async 启动几个线程时中止
- 为什么转置这个 std::vector<std::vector<std::string> > 这么慢?
- 是否有可能在没有复制的情况下传递 std::vector<int> 作为参数来获得 std::vector<std::array<int, 3>>?
- 在 boost::<double>asio::buffer 中使用像 std::vector<std::complex> 这样的参数
- 如何从 std::initializer_list<char const* 构建 std::vector<std::string>>
- 如何检查 std::vector<std::string> 的元素是否以某个子字符串开头?
- 在 std::vector<std::vector 中重新存储内部向量<TYPE>>
- 将 std::vector<std::string> 转换为 const char* const*
- 不能将结构push_back() 转换为 std::vector<std::shared_ptr<theStruct>> theVector
- SWIG:传递一个 std::vector< std::vector <double> >指向 python 的指针
- 将 std::vector<std::p air<const K, V>*> 转换为 std::vector<std::p air<const K, V>&g