Ошибка вставки карты: нельзя перезаписать первый элемент? - PullRequest
0 голосов
/ 12 октября 2011
static std::map <unsigned int, CPCSteps> bestKvariables;

inline void copyKBestVar(MaxMinVarMap& vMaxMinAll, size_t& K, std::vector<unsigned int>& temp)
{
    // copy top k variables and store in a vector.
    MaxMinVarMap::reverse_iterator iter1;
    size_t count;
    for (iter1 = vMaxMinAll.rbegin(), count = 0; iter1 != vMaxMinAll.rend()&& count <= K; ++iter1, ++count)
    {
        temp.push_back(iter1->second);
    }
}

void myAlgo::phase1(unsigned int& vTarget)
{

    CPCSteps KBestForT; // To store kbest variables for only target variable finally put in a global storage
    KBestForT.reserve(numVars);
    std::vector<unsigned int> tempKbest;
    tempKbest.reserve(numVars);
    .......
    .......
    copyKBestVar(mapMinAssoc, KBestSize, tempKbest); // Store k top variables as a k best for this CPC variable for each step
    KBestForT.push_back(tempKbest);
    .....
    .....
    bestKvariables.insert(make_pair(vTarget, KBestForT)); // Store k best in a Map
    .....
    ....
}

Проблема: Карта "bestKvariables" не перезаписывает первый элемент, но обновляет остальные элементы. Я попытался отладить его, но проблема, которую я обнаружил, заключается в команде вставки.

Заранее спасибо за помощь.

Другой вопрос: могу ли я зарезервировать размер карты (например, vector.reserve (..)) в начале, чтобы избежать затрат на вставку.

Извините за предоставление недостаточной информации.

Я имею в виду, если есть четыре переменные vTarget 1, 2, 3, 4. Я делаю некоторые статистические вычисления для каждой переменной. Для этих переменных существует более одной итерации, и я хотел бы сохранить лучшие k результатов каждой переменной в карте, чтобы использовать ее на следующей итерации.

Я видел, что первая вставленная переменная (с ключом unsigned int "vTarget") не обновляется на последующих итерациях (она остается значением, вставленным на первой итерации) Но другие переменные (ключи, вставленные после первой) остаются обновленными.

Ответы [ 2 ]

3 голосов
/ 12 октября 2011

Другой вопрос: могу ли я зарезервировать размер карты (например, vector.reserve (..)) в начале, чтобы избежать затрат на вставку.

std::map не имеет функции reserve() в отличие от std::vector.
Обычно стандартная библиотека предоставляет функции для контейнеров, которые обеспечивают и обеспечивают хорошую производительность илипредоставить средства для достижения того же.

Для контейнера типа std::vector перераспределение его хранилища может быть очень дорогостоящей операцией.Простой вызов push_back() может привести к тому, что каждый элемент в std::vector будет скопирован во вновь выделенный блок памяти.Вызов reserve() может избежать этих ненужных выделений и операций копирования для std::vector, и, следовательно, для него предусмотрено то же самое.

std::map никогда не нужно копировать все существующие / оставшиеся элементы просто потому, чтоновый элемент был вставлен или удален.Следовательно, он не предоставляет такой функции.

Хотя в стандарте не указывается, как следует реализовывать std::map, ожидаемое поведение и требуемая сложность гарантируют, что большинство реализаций реализуют его как tree, в отличие от std::vector, для которого необходимо размещать элементысмежные области памяти.

1 голос
/ 12 октября 2011

map::insert не должен обновлять / перезаписывать что-либо , просто вставлять еще не присутствующие элементы Используйте operator[] для обновления, оно также вставляет элементы, когда указанный ключ еще не существует.

...