Подпишитесь на наш Telegram-канал, чтобы всегда быть в курсе важных обновлений! Перейти

C++ Std::vector

На самом деле я Zodiak
Участник
Участник
Статус
Оффлайн
Регистрация
22 Дек 2020
Сообщения
1,113
Реакции
207
Что можно использовать вместо std::vector?
У меня несколько циклов проходится по каждому элементу тайника,и пушит в вектор эту информацию, а после этого я ее рисую,чем можно вектор заменить? На спрашивайте зачем, надо
 
Что можно использовать вместо std::vector?
У меня несколько циклов проходится по каждому элементу тайника,и пушит в вектор эту информацию, а после этого я ее рисую,чем можно вектор заменить? На спрашивайте зачем, надо
map?
 
Что можно использовать вместо std::vector?
У меня несколько циклов проходится по каждому элементу тайника,и пушит в вектор эту информацию, а после этого я ее рисую,чем можно вектор заменить? На спрашивайте зачем, надо
Напиши свой вектор! Это по сути просто ресайзабл массив который реаллоцируется при ресайзе и в него копируются данные из старого.
Напиши свой вектор! Это по сути просто ресайзабл массив который реаллоцируется при ресайзе и в него копируются данные из старого.
Пример имплементации:
Expand Collapse Copy
#define ARRALLOC(X) _malloca(X)

template <typename Type>
class DArray
{
private:
    Type* Ptr{ nullptr };
    unsigned long* References{ nullptr };

    unsigned long Size{};
    unsigned long MaxSize{};

public:
    unsigned long GetSize()
    {
        return Size;
    }

    unsigned long GetMaxSize()
    {
        return MaxSize;
    }

    Type* GetData()
    {
        return Ptr;
    }

public:
    void Resize(unsigned long NewSize)
    {
        Type* OldPtr = Ptr;
        MaxSize = NewSize * 2;
        Ptr = (Type*)malloc( MaxSize * sizeof(Type) );
        memcpy( Ptr, OldPtr, Size * sizeof(Type) );
        free(OldPtr);
    }

    Type& operator[](unsigned long Idx) {
        if (Idx > Size || Idx < 0) {
            __debugbreak();
        }

        return Ptr[Idx];
    }

    void Push(Type Value)
    {
        if (Size >= MaxSize)
            this->Resize(Size + 1);

        Ptr[Size] = Value;
        Size++;
    }

    Type Pop()
    {
        if (Size >= 0)
            return Ptr[Size--];

        return {};
    }

public:
    DArray(const DArray<Type>& other)
    {
        operator=(other);
    }

    DArray<Type>& operator=(const DArray<Type>& other)
    {
        this->Size = other.Size;
        this->Ptr = other.Ptr;
        this->MaxSize = other.MaxSize;
        this->References = other.References;
        *References = (*References) + 1;

        return *this;
    }

    DArray(unsigned long NewSize)
    {
        Ptr = (Type*)ARRALLOC(NewSize * sizeof(Type) );
        Size = 0;
        MaxSize = NewSize;
        References = (unsigned long*)ARRALLOC(4);
        memset(References, 0, 4);
    }

    DArray()
    {
       
        Ptr = (Type*)ARRALLOC(100 * sizeof(Type) );
        Size = 0;
        MaxSize = 100;
        References = (unsigned long*)ARRALLOC(4);
        memset(References, 0, 4);
    }

    ~DArray()
    {
        if (References)
            *References = (*References) - 1;

        if (Ptr != nullptr && References != nullptr && *References == -1) { // True destruction.
            free(Ptr);
            free(References);

            Ptr = nullptr;
            References = nullptr;
        }      
    }
};

#undef ARRALLOC
Возможны приколы.
 
из const wchar_t* в const char*
не совсем понимаю где это может понадобиться, но возможно всё же может, вот что-то вроде этого?
Function:
Expand Collapse Copy
const char* Convert(const std::wstring& data)
{
    if (data.size() == NULL || data.empty() == TRUE)
        return "";

    int wide = WideCharToMultiByte(CP_UTF8, 0, const_cast<LPWSTR>(data.c_str()), static_cast<int>(data.length()), nullptr, 0, nullptr, nullptr);

    if (wide == NULL) {
        return "";
    }

    std::string result(wide, 0);
    WideCharToMultiByte(CP_UTF8, 0, data.c_str(), static_cast<int>(data.length()), const_cast<LPSTR>(result.c_str()), wide, nullptr, nullptr);

    return result.c_str();
}
Macros:
Expand Collapse Copy
#define WTOC(words) Convert(words)

Output:
Expand Collapse Copy
const wchar_t* wName = L"artem";

std::cout << WTOC(wName) << std::endl;
 
Последнее редактирование:
не совсем понимаю где это может понадобиться, но возможно всё же может, вот что-то вроде этого?
Function:
Expand Collapse Copy
const char* Convert(const std::wstring& data)
{
    if (data.size() == NULL || data.empty() == TRUE)
        return "";

    int wide = WideCharToMultiByte(CP_UTF8, 0, const_cast<LPWSTR>(data.c_str()), static_cast<int>(data.length()), nullptr, 0, nullptr, nullptr);

    if (wide == NULL) {
        return "";
    }

    std::string result(wide, 0);
    WideCharToMultiByte(CP_UTF8, 0, data.c_str(), static_cast<int>(data.length()), const_cast<LPSTR>(result.c_str()), wide, nullptr, nullptr);

    return result.c_str();
}
Macros:
Expand Collapse Copy
#define WTOC(words) Convert(words)

Output:
Expand Collapse Copy
const wchar_t* wName = L"artem";

std::cout << WTOC(wName) << std::endl;
Дело в том что нужно без использования std
 
Дело в том что нужно без использования std
Function:
Expand Collapse Copy
const char* Convert(const wchar_t*& data) {
    int size = wcslen(data);

    if (size == NULL)
        return "";

    int wide = WideCharToMultiByte(CP_UTF8, 0, data, size, nullptr, 0, nullptr, nullptr);
    
    if (wide == NULL)
        return "";

    char result[1024];
    WideCharToMultiByte(CP_UTF8, 0, data, size, const_cast<LPSTR>(result), wide, nullptr, nullptr);

    return result;
}
Macros:
Expand Collapse Copy
#define WTOC(words) Convert(words)
Output:
Expand Collapse Copy
const wchar_t* wName = L"artem";
std::cout << WTOC(wName) << std::endl;
 
Что можно использовать вместо std::vector?
Структура ImVector в ImGui
1674355650877.png
 
Назад
Сверху Снизу