Создание карты с использованием членов структуры throws bad_alloc - PullRequest
0 голосов
/ 14 февраля 2019

Итак, у меня есть структура

struct float3
{
    float x, y, z;
};

, и я пытаюсь создать функцию, которая принимает значения x, y, z и сопоставляет их с ключами 0, 1, 2 для их соответствующего измерения.Я написал код ниже, но он выдает некорректное alloc_exception.Похоже, мне не хватает памяти.

KdTree::float2map(std::vector<float3>& data)
    {    
       std::vector<std::map<int, float> > m_pnts;
       int cnt = 0;
       for(int i = 0; i = data.size(); i++)
          {
             std::map<int, float> tmp;
             tmp.insert(std::make_pair(0, data[i].x));
             tmp.insert(std::make_pair(1, data[i].y));
             tmp.insert(std::make_pair(2, data[i].z));

             m_pnts.push_back(tmp);
             std::cout << m_pnts.size() << std::endl;
            }

       }

       return m_pnts;
    }

Я все еще довольно новичок в C ++, поэтому я уверен, что есть много других способов сделать это или оптимизировать этот подход.Проблема в том, что я должен сделать это 33 914 095 float3s, и я не могу придумать другой способ добиться этого.Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 14 февраля 2019

Посмотрите на эту строку кода:

for(int i = 0; i = data.size(); i++)

Вы устанавливаете i в data.size() в условии оператора for.Это приведет к выходу за границы, поскольку data.size() станет индексом для вектора data, элементы которого проиндексированы от 0 до data.size() - 1.

Вероятно, это не было вашим намерением.Используйте правильное условие в цикле for.Это должно быть:

for(int i = 0; i < data.size(); i++)

Или, что еще лучше, используйте диапазон для цикла , который поможет избежать таких ошибок:

for(const auto& ele: data)
{
    std::map<int, float> tmp;
    tmp.insert(std::make_pair(0, ele.x));
    tmp.insert(std::make_pair(1, ele.y));
    tmp.insert(std::make_pair(2, ele.z));
    m_pnts.push_back(tmp);
    std::cout << m_pnts.size() << std::endl;
}        
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...