2

具体来说,考虑到每个向量项都可能改变大小,STL 如何对齐 vector<vector< T > > 中的向量项?外部向量是否对齐引用并将项目保留在其他地方?

4

3 回答 3

6

Astd::vector持有指向数组第一个元素的指针。当元素数量发生变化并且数组需要增长或缩小时,分配一个新数组并复制数据。矢量对象本身的实际大小永远不会改变。

于 2013-08-02T20:59:59.703 回答
1

向量通常不会“改变大小”。通常,向量的存储是使用指向T成员变量的指针来实现的。(并且只有该指针指向的内存在调整大小时重新分配,自然不会改变向量实例本身的大小。)

于 2013-08-02T21:00:18.047 回答
0

标准向量基本上是围绕这个的包装器

template<typename T>
class vector
{
    T* m_data;
    size_t m_count;
    size_t m_capacity;

    //...
    void push_back(const T& src) {
        if (m_capacity < m_count + 1) {
            size_t newCapacity = m_capacity + growthRate();
            T* newData = ::realloc(m_data, newCapacity);
            // ...
            m_data = newData;
            m_capacity = newCapacity;
        }

        // copy into the slot at m_count
        m_data[m_count] = src;
        ++m_count;
    }
};

因此,给定的向量实例总是存储相同大小的元素。它可以包含多态或可变项的唯一方法是通过指针,例如

class Base {};
class D1 : public Base {};
class D2 : public Base { int i; };

std::vector<std::unique_ptr<Base>> vec;

vec.emplace_back(new Base);
vec.emplace_back(new D1);
vec.emplace_back(new D2);
于 2013-08-02T21:20:22.330 回答