调整向量c ++的大小

时间:2015-06-18 08:23:22

标签: c++ vector

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}}大小后,vecStruct1vecStruct1会不会有什么不同?

5 个答案:

答案 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/

向量动态处理它自己的内存(在堆中)。