C++ Вопрос Std::vector

На самом деле я Zodiak
Участник
Статус
Оффлайн
Регистрация
22 Дек 2020
Сообщения
1,025
Реакции[?]
181
Поинты[?]
70K
Что можно использовать вместо std::vector?
У меня несколько циклов проходится по каждому элементу тайника,и пушит в вектор эту информацию, а после этого я ее рисую,чем можно вектор заменить? На спрашивайте зачем, надо
 
Эксперт
Статус
Оффлайн
Регистрация
30 Дек 2019
Сообщения
1,967
Реакции[?]
958
Поинты[?]
19K
Что можно использовать вместо std::vector?
У меня несколько циклов проходится по каждому элементу тайника,и пушит в вектор эту информацию, а после этого я ее рисую,чем можно вектор заменить? На спрашивайте зачем, надо
map?
 
Pa$$ter
Пользователь
Статус
Оффлайн
Регистрация
9 Июн 2020
Сообщения
241
Реакции[?]
83
Поинты[?]
12K
Что можно использовать вместо std::vector?
У меня несколько циклов проходится по каждому элементу тайника,и пушит в вектор эту информацию, а после этого я ее рисую,чем можно вектор заменить? На спрашивайте зачем, надо
Напиши свой вектор! Это по сути просто ресайзабл массив который реаллоцируется при ресайзе и в него копируются данные из старого.
Напиши свой вектор! Это по сути просто ресайзабл массив который реаллоцируется при ресайзе и в него копируются данные из старого.
Пример имплементации:
#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
Возможны приколы.
 
На самом деле я Zodiak
Участник
Статус
Оффлайн
Регистрация
22 Дек 2020
Сообщения
1,025
Реакции[?]
181
Поинты[?]
70K
Узнать бы еще как преобразовать юникод в UTF-8, из const wchar_t* в const char*
 
I Want to Die in New Orleans
Участник
Статус
Оффлайн
Регистрация
10 Окт 2020
Сообщения
516
Реакции[?]
496
Поинты[?]
85K
из const wchar_t* в const char*
не совсем понимаю где это может понадобиться, но возможно всё же может, вот что-то вроде этого?
Function:
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:
#define WTOC(words) Convert(words)
Output:
const wchar_t* wName = L"artem";

std::cout << WTOC(wName) << std::endl;
 
Последнее редактирование:
На самом деле я Zodiak
Участник
Статус
Оффлайн
Регистрация
22 Дек 2020
Сообщения
1,025
Реакции[?]
181
Поинты[?]
70K
не совсем понимаю где это может понадобиться, но возможно всё же может, вот что-то вроде этого?
Function:
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:
#define WTOC(words) Convert(words)
Output:
const wchar_t* wName = L"artem";

std::cout << WTOC(wName) << std::endl;
Дело в том что нужно без использования std
 
I Want to Die in New Orleans
Участник
Статус
Оффлайн
Регистрация
10 Окт 2020
Сообщения
516
Реакции[?]
496
Поинты[?]
85K
Дело в том что нужно без использования std
Function:
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:
#define WTOC(words) Convert(words)
Output:
const wchar_t* wName = L"artem";
std::cout << WTOC(wName) << std::endl;
 
Сверху Снизу