Как указать начальный размер, используя неструктурируемый распределитель в стиле C ++ 11? - PullRequest
2 голосов
/ 10 мая 2019

В предыдущей ветке об обновлении Visual Studio 2015 std::list::sort, обрабатывающей список без распределителей по умолчанию, это был один из примеров, использованных для создания такого списка на основе примера Microsoft без распределителя по умолчанию.

Я пытаюсь выяснить, как создать экземпляр std::list с начальным (ненулевым) размером, без необходимости изменять размер после создания пустого списка.

// this part of the code based on Microsoft example
template <class T>  
struct Mallocator  
{  
    typedef T value_type;  
    Mallocator(T) noexcept {} //default ctor not required by STL  

    // A converting copy constructor:  
    template<class U> Mallocator(const Mallocator<U>&) noexcept {}  
    template<class U> bool operator==(const Mallocator<U>&) const noexcept  
    {  
        return true;  
    }  
    template<class U> bool operator!=(const Mallocator<U>&) const noexcept  
    {  
        return false;  
    }  
    T* allocate(const size_t n) const;  
    void deallocate(T* const p, size_t) const noexcept;  
};  

template <class T>  
T* Mallocator<T>::allocate(const size_t n) const  
{
    if (n == 0)  
    {  
        return nullptr;  
    }  
    if (n > static_cast<size_t>(-1) / sizeof(T))  
    {  
        throw std::bad_array_new_length();  
    }  
    void* const pv = malloc(n * sizeof(T));  
    if (!pv) { throw std::bad_alloc(); }  
    return static_cast<T*>(pv);  
}  

template<class T>  
void Mallocator<T>::deallocate(T * const p, size_t) const noexcept  
{  
    free(p);  
}  

typedef unsigned long long uint64_t;

#define COUNT (4*1024*1024-1)   // number of values to sort

int main(int argc, char**argv)
{
    // this line from a prior answer
    // the (0) is needed to prevent compiler error, but changing the
    // (0) to (COUNT) or other non-zero value has no effect, the size == 0
    std::list <uint64_t, Mallocator<uint64_t>> ll(Mallocator<uint64_t>(0));
    // trying to avoid having to resize the list to get an initial size.
    ll.resize(COUNT, 0);

1 Ответ

1 голос
/ 10 мая 2019

Я попробовал еще несколько вариантов этого, которые вызвали Visual Studio, чтобы показать различные комбинации параметров, и вариант 12 из 12 показал параметры в правильном порядке: (число, значение, распределитель).Обратите внимание, что в случае VS 2015 нет опции (количество, распределитель), значение должно быть включено.Значение в последнем параметре (0) не имеет значения, оно просто должно быть правильного типа.

    std::list <uint64_t, Mallocator<uint64_t>> ll(COUNT, 0, Mallocator<uint64_t>(0));

Поскольку Visual Studio смогла привести меня к решению (после нескольких попыток)), если маловероятно, что кто-то еще выиграет от этого, я удалю вопрос и ответ.

...