как получить доступ к карте векторов? - PullRequest
0 голосов
/ 17 января 2012

Я создал карту векторов и заполнил ее следующим образом.Вот кодЯ не могу разместить оригинальный код.Он содержит векторы двойников

map <int, vector <double> > Maptest;

for (int i = 0 ; i < ID1; i++)
{
    for (int j = 0 ; j < ID2; j++)
    {
        Maptest[i].push_back(j*0.01);
    }
}

map <int, vector <double> >::iterator MaptestITR;
CString testString;
for ( j = 0 ; j < ID2; j++)
{
    for (i = 0 ; i < ID1; i++)
    {
        MaptestITR = Maptest.find(i);
        if (MaptestITR != Maptest.end())
        {
            testString.Format(_T("%f",MaptestITR->second.at(j)));
        }
        myfile << testString<< ',' ;
    }
}

Но все значения обновляются как '0' (testString равен '0').В IDE значения правильно отображаются в Watch.

Что мне здесь не хватает?

Ответы [ 3 ]

1 голос
/ 17 января 2012

Ладно, я загрузил виртуальную машину на работе и провел примерное представление о том, каким может быть ваш код. В вашем коде есть некоторые вещи, которые я действительно не понимаю.

Во-первых, разве вы не обращаетесь к "at", чтобы получить доступ к чему-то вне vector? Разве это не нулевая ссылка? В этом случае, может быть, вы каждый раз обращаетесь к чему-то вне vector, и в результате поведение не определяется? Возможно, попробуйте использовать 0 вместо ID2 в

testString.Format(_T("%f",MaptestITR->second.at(ID2)));

Во-вторых, я запустил это приближение и получил ожидаемый результат. То есть я не понимаю, почему ваш код не будет работать, кроме возможного неопределенного поведения, о котором я упоминал ранее.

Наконец, не могли бы вы объяснить, что пытается сделать ваш код? Похоже, что просто получить доступ к той же позиции в единственном векторе на карте, после выталкивания, однако, многих из того же числа.

Если кто-нибудь может дать мне совет о том, как копировать с виртуальной машины, я также могу опубликовать аппроксимацию кода, которую я компилировал в Linux.

... а теперь вернемся к работе ...

1 голос
/ 17 января 2012

std::vector::at() ожидает целочисленный параметр.В частности, size_t.

Я не знаю, что такое тип ID2, но из кода, который вы дали, он не выглядит как size_t.

0 голосов
/ 17 января 2012

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

ДляВ целях этого ответа я предполагаю, что идентификаторы ID1 и ID2 являются простыми целочисленными переменными или макросами, которые являются простыми целочисленными константами (и имеют значение больше 0, иначе программа по существу ничего не сделает).Если ID1 или ID2 являются чем-то более сложным, трудно рассуждать о том, что должна или может делать программа, без дополнительной информации о том, что представляют собой эти идентификаторы.

Давайте внимательно посмотрим, что происходит в каждом вложенном цикле.

В первом:

Maptest[ID1].push_back(ID2*0.01);

Используемая клавиша map всегда одинакова, поскольку ID1 не изменяется.Таким образом, Maptest содержит только один элемент со значением ключа ID1 и вектор, который добавляет элементы к нему при каждой итерации цикла.Кроме того, каждый элемент, добавляемый к вектору, имеет одно и то же значение: (ID2 * 0.01).

В частности, обратите внимание, что хотя вложенные циклы управляются переменными i и j, эти переменныене привыкайте к вызову push_back().Таким образом, после завершения первого вложенного цикла, Maptest содержит одиночное отображение, в котором есть ключ ID1 и вектор с (ID1 * ID2) элементами.Каждый элемент этого вектора имеет значение (ID2 * 0.01).

Во втором вложенном цикле вы всегда находите один и тот же элемент в Maptest - тот, у которого есть ключ ID1 (что происходит сбыть единственным предметом в map).Часть vector<double> этого отображения имеет массив с элементами (ID1 * ID2), каждый из которых имеет одинаковое значение.Цикл их форматирует элемент с индексом ID2 в testString.Всегда один и тот же элемент из одного и того же вектора.Не то чтобы действительно имеет значение, какой элемент отформатирован в строку, поскольку каждый элемент вектора имеет одинаковое значение.

...