std::pair<std::string, float> проблемы
От: Towelie  
Дата: 09.04.11 23:17
Оценка:
Здравствуйте, я передаю итераторы начала и конца std::map в класс и в нем изменяю некоторые значения, но:

    typedef std::map<std::string, float> myOptions;

    myOptions::iterator optIT;
    size_t i = 0;

    for(myOptions::iterator optIT = optionsBegin; optIT != optionsEnd; optIT++)
    {
        (*optIT) = std::pair<std::string, float>(Text[i]), utility::parseFloat(Edit[i]);
    {

Код присвоения значения вызывает ошибку :

error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const std::string' (or there is no acceptable conversion)    c:\program files\microsoft visual studio 10.0\vc\include\utility

Читая MSDN и форумы, я не понял как обойти эту проблему, подскажите пожалуйста.
Re: std::pair<std::string, float> проблемы
От: dilmah США  
Дата: 09.04.11 23:20
Оценка: 1 (1) +3
T>Читая MSDN и форумы, я не понял как обойти эту проблему, подскажите пожалуйста.

ключ (строку) в итераторе мэпа нельзя менять -- меняя ключ ты можешь нарушить порядок. Поэтому ключ константный.
Re: std::pair<std::string, float> проблемы
От: MasterZiv СССР  
Дата: 10.04.11 06:18
Оценка: -1
On 10.04.2011 3:17, Towelie wrote:
> Здравствуйте, я передаю итераторы начала и конца std::map в класс и в нем
> изменяю некоторые значения, но:

Очень зря ты так делаешь.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: std::pair<std::string, float> проблемы
От: rg45 СССР  
Дата: 10.04.11 08:03
Оценка:
Здравствуйте, dilmah, Вы писали:


T>>Читая MSDN и форумы, я не понял как обойти эту проблему, подскажите пожалуйста.


D>ключ (строку) в итераторе мэпа нельзя менять -- меняя ключ ты можешь нарушить порядок. Поэтому ключ константный.


Вместо этого можно удалить старый элемент и добавить новый. Но для выполнения этой операции итераторов не достаточно, нужен доступ к контейнеру.
--
Справедливость выше закона. А человечность выше справедливости.
Re[2]: std::pair<std::string, float> проблемы
От: Towelie  
Дата: 10.04.11 08:55
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>On 10.04.2011 3:17, Towelie wrote:

>> Здравствуйте, я передаю итераторы начала и конца std::map в класс и в нем
>> изменяю некоторые значения, но:

MZ>Очень зря ты так делаешь.


А как тогда лучше всего хранить настройки в программе? Я видел похожую проблему там посоветовали boost::multi_array, есть еще что нибудь попроще и по удобнее?
Re: std::pair<std::string, float> проблемы
От: blonduser  
Дата: 10.04.11 09:49
Оценка:
Здравствуйте, Towelie, Вы писали:

T>Здравствуйте, я передаю итераторы начала и конца std::map в класс и в нем изменяю некоторые значения, но:


T>
T>    typedef std::map<std::string, float> myOptions;

T>    myOptions::iterator optIT;
T>    size_t i = 0;

T>    for(myOptions::iterator optIT = optionsBegin; optIT != optionsEnd; optIT++)
T>    {
T>        (*optIT) = std::pair<std::string, float>(Text[i]), utility::parseFloat(Edit[i]);
T>    {

T>

T>Код присвоения значения вызывает ошибку :

T>
T>error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const std::string' (or there is no acceptable conversion)    c:\program files\microsoft visual studio 10.0\vc\include\utility
T>

T>Читая MSDN и форумы, я не понял как обойти эту проблему, подскажите пожалуйста.

Ты неправильно используешь std::map

Читай внимательно —
Re[3]: std::pair<std::string, float> проблемы
От: rg45 СССР  
Дата: 10.04.11 09:49
Оценка:
Здравствуйте, Towelie, Вы писали:

>>> Здравствуйте, я передаю итераторы начала и конца std::map в класс и в нем

>>> изменяю некоторые значения, но:

MZ>>Очень зря ты так делаешь.


T>А как тогда лучше всего хранить настройки в программе? Я видел похожую проблему там посоветовали boost::multi_array, есть еще что нибудь попроще и по удобнее?


Предполагаю, что boost::multi_array тебе предложили потому, что ты точно так же, как и здесь не сформулировал толком задачу. Если хочешь получить помощь, расскажи внятно: дано то-то, то-то, надо сделать то-то, то-то.
--
Справедливость выше закона. А человечность выше справедливости.
Re[2]: std::pair<std::string, float> проблемы
От: blonduser  
Дата: 10.04.11 09:50
Оценка:
Здравствуйте, blonduser, Вы писали:

B>Здравствуйте, Towelie, Вы писали:


T>>Здравствуйте, я передаю итераторы начала и конца std::map в класс и в нем изменяю некоторые значения, но:


T>>
T>>    typedef std::map<std::string, float> myOptions;

T>>    myOptions::iterator optIT;
T>>    size_t i = 0;

T>>    for(myOptions::iterator optIT = optionsBegin; optIT != optionsEnd; optIT++)
T>>    {
T>>        (*optIT) = std::pair<std::string, float>(Text[i]), utility::parseFloat(Edit[i]);
T>>    {

T>>

T>>Код присвоения значения вызывает ошибку :

T>>
T>>error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const std::string' (or there is no acceptable conversion)    c:\program files\microsoft visual studio 10.0\vc\include\utility
T>>

T>>Читая MSDN и форумы, я не понял как обойти эту проблему, подскажите пожалуйста.

B>Ты неправильно используешь std::map


B>Читай внимательно — http://msdn.microsoft.com/en-us/library/xdayte4c.aspx
Re: std::pair<std::string, float> проблемы
От: ArkM  
Дата: 10.04.11 09:55
Оценка:
Здравствуйте, Towelie, Вы писали:

T>Здравствуйте, я передаю итераторы начала и конца std::map в класс и в нем изменяю некоторые значения, но:


T>
T>    typedef std::map<std::string, float> myOptions;

T>    myOptions::iterator optIT;
T>    size_t i = 0;

T>    for(myOptions::iterator optIT = optionsBegin; optIT != optionsEnd; optIT++)
T>    {
T>        (*optIT) = std::pair<std::string, float>(Text[i]), utility::parseFloat(Edit[i]);
T>    {

T>

T>Код присвоения значения вызывает ошибку :

T>
T>error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const std::string' (or there is no acceptable conversion)    c:\program files\microsoft visual studio 10.0\vc\include\utility
T>

T>Читая MSDN и форумы, я не понял как обойти эту проблему, подскажите пожалуйста.

Но в чем проблема-то? Приведенный фрагмент (псевдокода) пытается сделать что-то не очень понятное: что здесь i, Text и Edit?
Что здесь первично, а что строится? На входе пары ключ-значение, и надо построить map? Или задан map, и надо его модифицировать?
Вот когда это станет ясно, тогда и проблема исчезнет сама собой.
Re[4]: std::pair<std::string, float> проблемы
От: Towelie  
Дата: 10.04.11 10:26
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, Towelie, Вы писали:


>>>> Здравствуйте, я передаю итераторы начала и конца std::map в класс и в нем

>>>> изменяю некоторые значения, но:

MZ>>>Очень зря ты так делаешь.


T>>А как тогда лучше всего хранить настройки в программе? Я видел похожую проблему там посоветовали boost::multi_array, есть еще что нибудь попроще и по удобнее?


R>Предполагаю, что boost::multi_array тебе предложили потому, что ты точно так же, как и здесь не сформулировал толком задачу. Если хочешь получить помощь, расскажи внятно: дано то-то, то-то, надо сделать то-то, то-то.


Есть xml файл настроек, он парсится при загрузке и из него ключи добавляются в std::map, потом мне нужно изменить эти настройки и применить уже измененные.
Re[5]: std::pair<std::string, float> проблемы
От: rg45 СССР  
Дата: 10.04.11 10:55
Оценка:
Здравствуйте, Towelie, Вы писали:

T>Есть xml файл настроек, он парсится при загрузке и из него ключи добавляются в std::map, потом мне нужно изменить эти настройки и применить уже измененные.


Ну так это обычное штатное использование std::map:

#include <map>
#include <iostream>
#include <string>

int main()
{
  using std::string;
  typedef std::map<string, string> Settings;
  
  Settings settings;
  
  //Изменение и добавление выглядят одинаково:
  settings["host"] = "127.0.0.1";
  settings["port"] = "8080";
  settings["login"] = "Vasya";
  settings["login"] = "Kolya";
  
  //Чтение с доступом по ключу
  std::cout << "Login: " << settings["login"] << std::endl;
  
  std::cout << "------" << std::endl;
  
  //Чтение с проходом по контейнеру
  for(Settings::const_iterator entry = settings.begin(); entry != settings.end(); ++entry)
    std::cout << entry->first << "\t= " << entry->second << std::endl;
}

Output:
Login: Kolya
------
host    = 127.0.0.1
login   = Kolya
port    = 8080

Можно усовершенствовать и сделать хранилище настроек типизированным, но это уже следующая серия.
--
Справедливость выше закона. А человечность выше справедливости.
Re[6]: std::pair<std::string, float> проблемы
От: rg45 СССР  
Дата: 10.04.11 11:20
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, Towelie, Вы писали:


T>>Есть xml файл настроек, он парсится при загрузке и из него ключи добавляются в std::map, потом мне нужно изменить эти настройки и применить уже измененные.


R>Ну так это обычное штатное использование std::map:


R>
R>#include <map>
R>#include <iostream>
R>#include <string>

R>int main()
R>{
R>  using std::string;
R>  typedef std::map<string, string> Settings;
  
R>  Settings settings;
  
R>  //Изменение и добавление выглядят одинаково:
R>  settings["host"] = "127.0.0.1";
R>  settings["port"] = "8080";
R>  settings["login"] = "Vasya";
R>  settings["login"] = "Kolya";
  
R>  //Чтение с доступом по ключу
R>  std::cout << "Login: " << settings["login"] << std::endl;
  
R>  std::cout << "------" << std::endl;
  
R>  //Чтение с проходом по контейнеру
R>  for(Settings::const_iterator entry = settings.begin(); entry != settings.end(); ++entry)
R>    std::cout << entry->first << "\t= " << entry->second << std::endl;
R>}
R>


Доплнение. Изменение значений можно делать не только с доступом по ключу, но и через итераторы. Например, если на (зачем-то) требуется все значения настроек взять в одиночные кавычки это можно сделать так:
  for(Settings::iterator entry = settings.begin(); entry != settings.end(); ++entry)
    entry->second = "'" + entry->second + "'";

Тебе нужно понять одну простую вещь: каждый элемент контейнера типа std::map состоит из двух частей: ключ и значение. Можно изменить значение элемента контейнера, но ключ изменить нельзя.
--
Справедливость выше закона. А человечность выше справедливости.
Re[5]: std::pair<std::string, float> проблемы
От: inofa  
Дата: 10.04.11 15:57
Оценка: +2
Здравствуйте, Towelie, Вы писали:


T>Есть xml файл настроек, он парсится при загрузке и из него ключи добавляются в std::map, потом мне нужно изменить эти настройки и применить уже измененные.


Лучше сразу смотреть в сторону boost::property_tree
Re[3]: std::pair<std::string, float> проблемы
От: MasterZiv СССР  
Дата: 10.04.11 17:41
Оценка:
On 10.04.2011 12:55, Towelie wrote:

> MZ>Очень зря ты так делаешь.

>
> А как тогда лучше всего хранить настройки в программе? Я видел похожую проблему
> там посоветовали boost::multi_array, есть еще что нибудь попроще и по удобнее?

Храни как хочешь, только если тебе нужно что-то с элементом мапы делать, делай
erase, а затем insert. Если и можно что-то менять, то это ТОЛЬКО значение, НЕ
КЛЮЧ ни в коем случае.
Posted via RSDN NNTP Server 2.1 beta
Re[6]: std::pair<std::string, float> проблемы
От: MasterZiv СССР  
Дата: 10.04.11 17:45
Оценка:
On 10.04.2011 19:57, inofa wrote:

> Лучше сразу смотреть в сторону boost::property_tree

(видимо, имелся в виду property_map)
может быть лучше boost::program_options ?
Posted via RSDN NNTP Server 2.1 beta
Re: std::pair<std::string, float> проблемы
От: fdn721  
Дата: 11.04.11 08:05
Оценка:
Здравствуйте, Towelie


Эта штука по кошернее буста будет:

http://www.rsdn.ru/article/xml/xmlcpp.xml
Автор(ы): Андрей Мартынов
Дата: 30.11.2003
В статье рассмотрен декларативный подход к решению задачи чтения/записи XML-файлов из программ на классическом C++. Метод основан на построении специальной структуры статических данных — метаданных типов.
Re[7]: std::pair<std::string, float> проблемы
От: antonio_banderas Россия  
Дата: 11.04.11 08:14
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>On 10.04.2011 19:57, inofa wrote:


>> Лучше сразу смотреть в сторону boost::property_tree

MZ>(видимо, имелся в виду property_map)
MZ>может быть лучше boost::program_options ?

Что-то мне подсказывает, что товарищу Towelie еще рано буст юзать.
Лучше std::map.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.