Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C+中声明向量和集合+; 这是我第一次用C++中的STL容器工作,在谷歌中看到不同的例子,我注意到了一些向量和集合的声明。p>_C++_Pointers_Vector_Set - Fatal编程技术网

在C+中声明向量和集合+; 这是我第一次用C++中的STL容器工作,在谷歌中看到不同的例子,我注意到了一些向量和集合的声明。p>

在C+中声明向量和集合+; 这是我第一次用C++中的STL容器工作,在谷歌中看到不同的例子,我注意到了一些向量和集合的声明。p>,c++,pointers,vector,set,C++,Pointers,Vector,Set,如果您有一个类a,并且希望将这些元素存储在向量中,那么可以使用指向对象的指针(如下所示)。而对于集合,则在声明中使用实际对象。我想知道这样做是否有特殊的原因,或者我看到的例子中就是这样 vector<*A> cont1; set<A> cont2; vectorcont1; 设置cont2; 这只是您遇到的示例。可以在向量中存储从对象本身到指针、函数指针的任何内容。还可以在向量中存储其他向量以定义多维向量: // define 4x4 vector vector<

如果您有一个类a,并且希望将这些元素存储在向量中,那么可以使用指向对象的指针(如下所示)。而对于集合,则在声明中使用实际对象。我想知道这样做是否有特殊的原因,或者我看到的例子中就是这样

vector<*A> cont1;
set<A> cont2;
vectorcont1;
设置cont2;

这只是您遇到的示例。可以在向量中存储从对象本身到指针、函数指针的任何内容。还可以在向量中存储其他向量以定义多维向量:

// define 4x4 vector
vector< vector<int> > vec(4, vector<int>(4));

vec[i][j] = a;     // write
int b = vec[i][j]; // read
//定义4x4矢量
向量vec(4,向量(4));
vec[i][j]=a;//写
int b=vec[i][j];//阅读
矢量cont1;
继续1.推回(新A(无论什么));
载体cont2;
继续2.推回(A(无论什么));
这取决于您使用的用例。是否要存储对象或指针


请注意,第一个示例需要您手动删除每个对象,而第二个示例将为您处理删除操作。尽可能使用第二种方法,除非你知道自己在做什么。它还使分配(等)安全。

这取决于您要存储的内容

std::vector<A*> myVector;
std::vector myVector;
…将创建一个存储指向a类型的指针的向量

std::set<A> mySet;
std::set mySet;
…将创建一个集合来存储类型的实际实例

std::set<A> mySet;
您可以同样轻松地将实际实例存储在向量中:

std::vector<A> myVector;
std::vector myVector;
或集合中的指针:

std::set<A*> mySet;
std::set mySet;

我不知道这是一种常见的做法

但是,这样做的一个可能原因是,当
向量调整大小时,所包含的对象可以在内存中移动。如果包含的对象将其
this
指针指向其他对象,则在
调整大小后,该指针可能无效。通过存储指针和自己管理内存,对象就不会受到影响

使用
集合
,您不会观察到相同的行为,因为集合往往被实现为树。请注意:我不认为C++标准库对这个……有任何保证……
如果作者试图利用
set
利用这一点,那么他们就是在滥用封装规则。如果没有,那么您提供的两个示例可能是不相关的。您将指针(或不将指针)存储在容器中还有许多其他原因,您可以自由选择。

在大多数情况下,您最终将使用具有自动存储持续时间的对象容器,而不是指针/智能指针,因为这样的容器将为您提供丑陋的内存管理

简单
std::vector

集合和向量之间的真正区别在于集合包含所有唯一的元素,并且其操作的运行时不同。他们根本不是对等的

造成这种差异的原因是,您可以拥有两个相等但存储在不同位置的动态分配对象。如果您这样做:

A、b;
std::vector myVector;
myVector.push_back(a);
myVector.push_back(b);
那么myVector将包含两个元素,但在以下情况下:

A、b;
std::设置mySet;
mySet.插入(a);
mySet.插入(b);
mySet将只包含一个。如果我们使用指针,情况就不会是这样了

此外,动态分配项以在向量中使用的原因(如其他人所述)是为了减少插入的开销


干杯

向量是可以保存任何可复制内容的简单容器。因此,根据您的需要,您可以在其中放置对象或指向对象的指针


虽然集合也可以包含指针,但这样做通常没有多大意义。集合是有序容器,这意味着在创建集合时,需要指定比较函数。如果不指定一个,将使用默认的比较函数(
std::less
),该函数取决于您在集合中存储的要使用
运算符的内容。不应存在任何差异。无论何时看到
向量
,它都应该对应于
集合
,如果可能的话,这些应该优先于任何类型的指针。该标准确实保证对于
std::set
,对元素的引用(以及扩展为指针)不会因插入或擦除操作而无效,当然,除了对正在擦除的对象的引用。感谢@BenjaminLindley澄清=)希望我答案的大部分内容仍然有用!是的,当然它仍然有用。事实上,我认为这是唯一一个真正突出说明在向量中使用指针的原因,而这不适用于在集合中使用Poniter。