struct struct1
{
vector<unsigned> vec1;
};
void main()
{
vector<struct1> vecStruct1;
struct1 obj1Struct1;
struct1 obj2Struct1;
vecStruct1.push_back(obj1Struct1);
vecStruct1.push_back(obj2Struct1);
}
现在,如果我调整对象vec1
的{{1}}的{{1}},那么struct1
也会调整大小,即它会导致{{1}中的重新分配在调整vecStruct1[0]
的{{1}}大小后,vecStruct1
和vecStruct1
会不会有什么不同?
答案 0 :(得分:3)
Nope,vector
将其元素存储在堆中,而不是在结构内部,因此vector
本身在调整大小时永远不会增长,增长的是{{1指向的数据缓冲区}}
答案 1 :(得分:2)
由于vecStruct1
包含obj1Struct1
的副本,一旦添加了对象,则2对象是不同的。
因此修改obj1Struct1
不会修改vecStruct1[0]
。
答案 2 :(得分:2)
也许这个例子将澄清情况:
#include <iostream>
#include <vector>
using namespace std;
struct struct1
{
vector<unsigned> vec1;
};
int main() {
vector<struct1> vecStruct1;
struct1 obj1Struct1;
struct1 obj2Struct1;
vecStruct1.push_back(obj1Struct1);
vecStruct1.push_back(obj2Struct1);
cout << "Before resizing the vector:" << endl;
cout << "Address of vecStruct1[0]:" << &vecStruct1[0] << endl;
cout << "Address of vecStruct1[1]:" << &vecStruct1[1] << endl;
cout << "Capacity of the vector in vecStruct1[0]:" << vecStruct1[0].vec1.capacity() << endl;
cout << "Capacity of the vector in vecStruct1[1]:" << vecStruct1[1].vec1.capacity() << endl;
cout << endl;
vecStruct1[0].vec1.resize(1000);
cout << "After resizing vecStruct1[0]:" << endl;
cout << "Address of vecStruct1[0]:" << &vecStruct1[0] << endl;
cout << "Address of vecStruct1[1]:" << &vecStruct1[1] << endl;
cout << "Capacity of the vector in vecStruct1[0]:" << vecStruct1[0].vec1.capacity() << endl;
cout << "Capacity of the vector in vecStruct1[1]:" << vecStruct1[1].vec1.capacity() << endl;
cout << endl;
vecStruct1[1].vec1.resize(2000);
cout << "After resizing vecStruct1[1]:" << endl;
cout << "Address of vecStruct1[0]:" << &vecStruct1[0] << endl;
cout << "Address of vecStruct1[1]:" << &vecStruct1[1] << endl;
cout << "Capacity of the vector in vecStruct1[0]:" << vecStruct1[0].vec1.capacity() << endl;
cout << "Capacity of the vector in vecStruct1[1]:" << vecStruct1[1].vec1.capacity() << endl;
cout << endl;
return 0;
}
输出(您可以在ideone:http://ideone.com/JVaiqg上查看)是:
Before resizing the vector:
Address of vecStruct1[0]:0x8f33018
Address of vecStruct1[1]:0x8f33024
Capacity of the vector in vecStruct1[0]:0
Capacity of the vector in vecStruct1[1]:0
After resizing vecStruct1[0]:
Address of vecStruct1[0]:0x8f33018
Address of vecStruct1[1]:0x8f33024
Capacity of the vector in vecStruct1[0]:1000
Capacity of the vector in vecStruct1[1]:0
After resizing vecStruct1[1]:
Address of vecStruct1[0]:0x8f33018
Address of vecStruct1[1]:0x8f33024
Capacity of the vector in vecStruct1[0]:1000
Capacity of the vector in vecStruct1[1]:2000
正如您所看到的,vecStruct1[0]
和vecStruct1[1]
的地址永远不会改变。这是因为向量的每个元素都有一个固定的大小,并且在内部它包含一个指向存储调整大小的向量的区域的指针。当您调整向量的大小(&#34;内部&#34;那些,即每个vec1
内的每个struct1
)时,可能必须将它们移动到新地址,但&#34;外部&#34;向量vecStruct1
保持原样。
答案 3 :(得分:1)
不,这两个载体完全不相关。将元素添加到一个向量,或以其他方式调整大小,不会导致任何其他向量调整大小。
此外,调整vecStruct1[0].vec1
的大小不会调整vecStruct1[1].vec1
的大小。
澄清:
如果你有指向vecStruct1
中第一个元素的指针(即&vecStruct1[0]
),那么如果调整vecStruct1
的大小,指针将无效。你对vecStruct1[0].vec1
所做的事情在这里并不重要,vecStruct1[0].vec1
中指向元素的指针不会改变。
如果你有一个指针&(vecStruct1[0].vec1[0])
(不需要括号但是为了清晰起见而添加了),那么如果你调整vecStruct1
那么指针不会改变。您需要调整vecStruct1[0].vec1
的大小才能使该指针无效。
答案 4 :(得分:0)
向量在堆中处理其内存,在堆中,如另一个答案中所述。因此,在结构内调整矢量大小或重新分配不会改变结构的大小,甚至不会改变包含该结构的矢量。
http://www.cplusplus.com/reference/vector/vector/
向量动态处理它自己的内存(在堆中)。