Здравствуйте! Прошу прощения, тема поднималась, она мне помогла но не все понятно!
Имею:
struct TableMatrix
{
String ColName;
String Value;
TableMatrix(const String &cn, String v): ColName(cn), Value(v) {}
};vector<vector<TableMatrix> > my_table;
Далее в цикле заполняю:
My_table[row].push_back(TableMatrix(i,j));
где i- название столбца, j-его значение в строке, row-номер строки.
В итоге имею матрицу типа:
String v= my_table[Row][Col].Value;
String c= my_table[Row][Col].ColName;Т.е имею привязку - Название столбца/номер строки/содержимое ячейки
Все хорошо, за исключением того что не получается применить ни одну функцию
т. е.
max_element(my_table[0].Value.begin(), my_table[0].Value.end()); естес-но не работает
т.е алгоритм begin не понимает переменную типа my_table[0].Value.Можно не использовать структуру, и название столбца брать по индексу, то все работает, но мне хотелось бы именно так.
Простите если описал все не очень понятно...За ранее благодарен....
>т. е.
>max_element(my_table[0].Value.begin(), my_table[0].Value.end()); естес-но не работает
>т.е алгоритм begin не понимает переменную типа my_table[0].Value.
>
>Можно не использовать структуру, и название столбца брать по индексу, то все
>работает, но мне хотелось бы именно так.
>Простите если описал все не очень понятно...За ранее благодарен....Знаешь, я бы начал с изменения названий!
то что в самом начале у тебя называется TableMatrix, можно назвать как нибудь по скромнее, и по понятнее, типа Cell
Иногда простое переименование переменных и типов может во многом упростить программирование.ну а что касается:
>max_element(my_table[0].Value.begin(), my_table[0].Value.end()так это ты просто не туда применяешь методы шаблона Vector
пытаясь вызвать итератор у объекта строка.(хотя кажеться, Value и быть не должно)
напиши что нить подобное:
max_element(my_table[0].begin(), my_table[0].end())
>напиши что нить подобное:
>max_element(my_table[0].begin(), my_table[0].end())Спасибо, пробовал, но не так и даже не так не компилится:
max_element(my_table.begin(), my_table.end());
Ошибок синтаксиса не показывает, но вылетает при обращении к функции(), т.е. видимо нельзя использовать функции со струтурными типами данных.
Нужно научиться обращаться именно ко значению внутри структуры...
>>напиши что нить подобное:
>>max_element(my_table[0].begin(), my_table[0].end())
>
>Спасибо, пробовал, но не так и даже не так не компилится:
>
>max_element(my_table.begin(), my_table.end());
>
>Ошибок синтаксиса не показывает, но вылетает при обращении к функции(), т.е. видимо
>нельзя использовать функции со струтурными типами данных.
>Нужно научиться обращаться именно ко значению внутри структуры...а что это за функция max_element ?
что ей на вход должно поступать?
насколько я помню, my_table.begin() должен возвращать итератор, проходящий по контейнеру.
>а что это за функция max_element ?Стандартный алгоритм: http://cppreference.com/cppalgorithm/max_element.html
>что ей на вход должно поступать?
Два итератора.
И ещё у элементов вектора должен быть определён operator<Иначе как она выяснит, какой из элементов вектора больше? (У неё нет искусственного интеллекта чтобы догадаться самой полезть вовнутрь структуры)
>И ещё у элементов вектора должен быть определён operator<
>
>Иначе как она выяснит, какой из элементов вектора больше? (У неё
>нет искусственного интеллекта чтобы догадаться самой полезть вовнутрь структуры)да, и теперь становиться понятно почему все это не работает, а заодно и недостаток
структуры, в которой теперь придеться Value постоянно преобразовывать, в числовое значение.
>vector<vector<TableMatrix> > my_table;Вектор векторов - крайне неэффективно и в плане памяти, и быстродействия, и удобства использования. Кроме того, для матриц, хранящихся в одномерных массивов в STL есть такая удобная штука, как срезы.
>String v= my_table[Row][Col].Value;
>String c= my_table[Row][Col].ColName;
>
>т.е алгоритм begin не понимает переменную типа my_table[0].Value.Такого вообще не существует.
my_table[0] - это vector<TableMatrix>, у него, разумеется, нет никаких .Value.
>Можно не использовать структуру
Если ты собираешься использовать стандартные алгоритмы, надо как минимум определить operator < для TableMatrix, или передавать в max_element функтор, сравнивающий твои структуры.
> max_element(my_table.begin(), my_table.end());
В твоем vector<vector<TableMatrix> > это СРАВНИВАЕТ ВЕКТОРА!!!
Спасибо всем ответившим!
Наконец-то мне подсказали как это сделать. Оказалось все просто.
Напишу этот метод как вытащить данные из такой конструкции:Создаем следующую функцию:
bool compare_value(const TableMatrix& x, const TableMatrix& y)
{return (x.Value < y.Value);}Создаем итератор:
vector<TableMatrix>::iterator iterator;
iterator= max_element(my_table[0].begin(), my_table[0].end(), compare_value);
String str1= iterator->Value;
String str2=iterator->ColName;подобное описано в msdn.