Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> stringstream в map . Как? 
:(
    Опции темы
RinOSpro
Дата 22.11.2011, 15:46 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Всем привет!

Как правильно написать и использовать нечто подобное: 

Код

map<string, auto_ptr<stringstream> > params;

// params["name"] << val;



  Вверх
bsa
Дата 22.11.2011, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



RinOSpro, никак. auto_ptr нельзя использовать внутри контейнеров. И вообще, почитай про него подробней.
PM   Вверх
boostcoder
Дата 22.11.2011, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



RinOSpro, помимо того о чем написал bsa, тебе еще нужно будет самому создавать объекты stringstream`а.
Код

#include <iostream>
#include <sstream>
#include <map>
#include <memory>

int main() {
   std::map<std::string, std::unique_ptr<std::stringstream>> map;
   map["1"].reset(new std::stringstream);
   *map["1"] << "bla bla bla";
   
   std::cout << map["1"]->str() << std::endl;
}


http://liveworkspace.org/code/46dae6131663...28d11c772845fb0
PM WWW   Вверх
RinOSpro
Дата 22.11.2011, 16:03 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(bsa @  22.11.2011,  15:53 Найти цитируемый пост)
RinOSpro, никак. auto_ptr нельзя использовать внутри контейнеров. И вообще, почитай про него подробней.


Дело не в auto_ptr, а в stringstream... можно ли stringstream каким то другим способом засунуть в контейнер?
  Вверх
bsa
Дата 22.11.2011, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



RinOSpro, конечно. засовывай в контейнер указатель на поток и все. В чем проблема? Вот только делать:
Код
*map["1"] << "bla bla";
Не очень безопасно. Так как нет проверки на существование записи с ключом "1". Поэтому надо делать так:
Код
....::const_iterator it = map.find("1");
if (it == map.end())
   //ошибка
*it->second << "bla bla";


Это сообщение отредактировал(а) bsa - 22.11.2011, 16:08
PM   Вверх
RinOSpro
Дата 22.11.2011, 16:13 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(boostcoder @  22.11.2011,  16:03 Найти цитируемый пост)
std::map<std::string, std::unique_ptr<std::stringstream>> map;

А счастье было так возможно...)
Цитата

This file requires compiler and library support for the upcoming ISO C++ standard, C++0x. 


Цитата(bsa @  22.11.2011,  16:08 Найти цитируемый пост)
Не очень безопасно. Так как нет проверки на существование записи с ключом "1". Поэтому надо делать так:

Еще и грозит утечками...
  Вверх
boostcoder
Дата 22.11.2011, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(RinOSpro @  22.11.2011,  16:13 Найти цитируемый пост)
А счастье было так возможно...)

в подписи компилятор ;)
PM WWW   Вверх
bsa
Дата 22.11.2011, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(RinOSpro @  22.11.2011,  17:13 Найти цитируемый пост)
А счастье было так возможно...)

попробуй добавить ключ компиляции -std=c++11
Цитата(RinOSpro @  22.11.2011,  17:13 Найти цитируемый пост)
Еще и грозит утечками... 

что и кому? при использовании unique_ptr не грозит.

PM   Вверх
boostcoder
Дата 22.11.2011, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(bsa @  22.11.2011,  16:20 Найти цитируемый пост)
-std=c++11

нее. этот только в 4.7.х появился.

Добавлено через 1 минуту и 24 секунды
RinOSpro, а ключи известны заранее?
PM WWW   Вверх
bsa
Дата 22.11.2011, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



хорошо, в более старых есть -std=c++0x
PM   Вверх
borisbn
Дата 22.11.2011, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(bsa @  22.11.2011,  16:30 Найти цитируемый пост)
хорошо, в более старых есть -std=c++0x

не пойму, почему в современных это не включено по-default'у...


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
bsa
Дата 23.11.2011, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



потому же, почему и C99 не включено в компиляторах С - для совместимости со старым ПО.
PM   Вверх
RinOSpro
Дата 23.11.2011, 11:59 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Компилятор Qt Creator 2.0.1, Основан на Qt 4.7.0 (32-х битной)
Включил (вроде как) поддержку C++0x таким образом:

Цитата

if win32{
    QMAKE_CXXFLAGS += -std=gnu++0x
}
else {
    QMAKE_CXXFLAGS += -std=c++0x
}


Но при компиляции выдает такую ошибку:
Цитата

error: deleted function 'std::unique_ptr<_Tp, _Tp_Deleter>::unique_ptr(const std::unique_ptr<_Tp, _Tp_Deleter>&) [with _Tp = std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >, _Tp_Deleter = std::default_delete<std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> > >]


Цитата(boostcoder @  22.11.2011,  16:23 Найти цитируемый пост)
RinOSpro, а ключи известны заранее?

Какие ключи?

Это сообщение отредактировал(а) RinOSpro - 23.11.2011, 11:59
  Вверх
bsa
Дата 23.11.2011, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(RinOSpro @  23.11.2011,  12:59 Найти цитируемый пост)
Какие ключи?

ключи map'а - то что в квадратных скобках.
Цитата(RinOSpro @  23.11.2011,  12:59 Найти цитируемый пост)
Но при компиляции выдает такую ошибку:

http://stackoverflow.com/questions/3763621...e-ptr-gcc-4-4-4
PM   Вверх
RinOSpro
Дата 23.11.2011, 13:31 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(boostcoder @  22.11.2011,  16:23 Найти цитируемый пост)
RinOSpro, а ключи известны заранее?

да.


Цитата(bsa @  23.11.2011,  12:51 Найти цитируемый пост)
http://stackoverflow.com/questions/3763621...e-ptr-gcc-4-4-4

Не понял как это применить к моему случаю, там предлагают использовать std::move. 
Но почему то не получается сделать в связке c map. 

Так работает:
Код

    unique_ptr<stringstream> ss(new stringstream);
    unique_ptr<stringstream> orig(new stringstream);

    *orig << "bla bla bla";
    ss = std::move(orig);


Так не работает:
Код

    map<string, unique_ptr<stringstream> > map;
    unique_ptr<stringstream> orig(new stringstream);

    *orig << "bla bla bla";
    map["1"] = std::move(orig);

error: deleted function 'std::unique_ptr<_Tp, _Tp_Deleter>




Это сообщение отредактировал(а) RinOSpro - 23.11.2011, 13:52
  Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0636 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.