Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос по std::map / 9 сообщений из 9, страница 1 из 1
15.02.2006, 15:18
    #33546725
Gradient
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по std::map
Есть такие объявления:

Код: plaintext
1.
2.
map <string, string> ms;
map <string, string>::iterator it_ms;
ofstream of;

заполняем карту... ну хотя бы так:
Код: plaintext
1.
2.
ms["k1"] = "aa";
ms["k2"] = "bb";
ms["k3"] = "cc";

почему выражение
Код: plaintext
of << (*it_ms).first.c_str();
выполняется нормально, а
Код: plaintext
of << (*it_ms).second.c_str();
вылетает с access violation?
...
Рейтинг: 0 / 0
15.02.2006, 15:39
    #33546829
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по std::map
it_ms вы как инициализируете?
...
Рейтинг: 0 / 0
15.02.2006, 16:14
    #33546956
Gradient
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по std::map
как ms.begin().

Полный код примерно такой (надергал не компилируя):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
map <string, string> ms;
map <string, string>::iterator it_ms;
ofstream of;

ms["k1"] = "aa";
ms["k2"] = "dd";
ms["k3"] = "cc";

of.open("_out_map");
for (it_ms = ms.begin();  it_ms != ms.end();  it_ms++){
	of << (*it_ms).first.c_str() << endl;
}
of.close();

вот это работает. Но никакие попытки вывести second у меня успеха не имели :-(
...
Рейтинг: 0 / 0
15.02.2006, 16:25
    #33547015
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по std::map
Gradientкак ms.begin().

Полный код примерно такой (надергал не компилируя):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
map <string, string> ms;
map <string, string>::iterator it_ms;
ofstream of;

ms["k1"] = "aa";
ms["k2"] = "dd";
ms["k3"] = "cc";

of.open("_out_map");
for (it_ms = ms.begin();  it_ms != ms.end();  it_ms++){
	of << (*it_ms).first.c_str() << endl;
}
of.close();

вот это работает. Но никакие попытки вывести second у меня успеха не имели :-(

сэконд Вы случаем не в цикле пытаетесь выводить ?
тогда он попытаеться взять элемент за концом последнего.

(круглый)
...
Рейтинг: 0 / 0
15.02.2006, 16:44
    #33547100
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по std::map
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <map>
#include <iostream>
#include <fstream>

using namespace std;

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
map <string, string> ms;
map <string, string>::iterator it_ms;
ofstream of;

ms["k1"] = "aa";
ms["k2"] = "dd";
ms["k3"] = "cc";

of.open("_out_map");
for (it_ms = ms.begin();  it_ms != ms.end();  it_ms++){
	of << (*it_ms).second.c_str() << endl;
}
of.close();
}

_out_map
aa
dd
cc


Это на BCB6
...
Рейтинг: 0 / 0
15.02.2006, 16:47
    #33547108
Gradient
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по std::map
kolobok0сэконд Вы случаем не в цикле пытаетесь выводить ?
В цикле. Примерно так:
Код: plaintext
1.
of << (*it_ms).first.c_str() << ", ";
of << (*it_ms).second.c_str() << endl;
kolobok0тогда он попытаеться взять элемент за концом последнего.
Это почему? Конструкция (*it_ms) вроде как возвращает пару, у которой есть как первый элемент, так и второй. Или я чего-то не понимаю?

А как тогда вывести <key, value> построчно в файл?
...
Рейтинг: 0 / 0
15.02.2006, 16:51
    #33547122
ZrenBy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по std::map
Всё работает. Что-то у тебя еще там есть ...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
#include <map>
#include <string>
#include <iostream>

int main(){
  std::map <std::string, std::string> ms;
  std::map <std::string, std::string>::iterator it_ms, ie;

  ms["k1"] = "aa";
  ms["k2"] = "dd";
  ms["k3"] = "cc";

  for (it_ms = ms.begin(), ie = ms.end(); it_ms != ie; ++it_ms){
    std::cout << (*it_ms).first.c_str() << " = ";
    std::cout << (*it_ms).second.c_str() << std::endl;
  }
  return  0 ;
}
...
Рейтинг: 0 / 0
15.02.2006, 17:07
    #33547175
Gradient
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по std::map
Хм... Действительно работает. Из моих действий - пожалуй, только solution перегрузил. Всем огромное спасибо за участие.
...
Рейтинг: 0 / 0
18.05.2006, 01:24
    #33734199
cruse
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по std::map
Как организовать с помощью std::map чтоб дание імені ключа і значения сохранялиль в разних файлах на диске!!
Вот пример:
#include <iostream>
#include <map>
#include <cstring>
#include <conio.h>
using namespace std;
// клас для зберігання імен-ключів
class name {
char str[20];
public:
name() {strcpy(str, "");}
name(char *s) {strcpy(str, s);}
char *get() {return str;}
};
// для объектів класу name треба
// визначити оператор < (менше)
bool operator<(name a, name b) {
return strcmp(a.get(), b.get()) < 0;
}
// клас для зберігання номерів-значень
class phonenum {
char str[20];
public:
phonenum() {strcmp(str, "");}
phonenum(char *s) {strcpy(str, s);}
char *get() {return str;}
};
typedef map<name, phonenum, less<name> > psevdo;
// друк однієї пари ключ/значення
template <class First, class Second> ostream&
operator<<(ostream& out, const pair<First,Second>
&pp){
cout <<"Reis: "<< pp.first.get() << " Vartist: "
<< pp.second.get();
return out;
}
int main() {
map<name, phonenum, less<name> > m;
// ініціалізація асоціативного списку
// іменами і номерами
m.insert(pair <name, phonenum>
(name("Lv-Kiev"),phonenum("10$")));
m.insert(pair <name, phonenum>
(name("Lv-London"), phonenum("100$")));
m.insert(pair <name, phonenum>
(name("Lv-Odessa"), phonenum("50$")));
m.insert(pair<name, phonenum>
(name("Lv-Greece"), phonenum("200")));
//ввід імені ключа
char str[80];
cout << "Input name: ";
cin >> str;
map <name, phonenum, less<name> >::iterator p;
// пошук номера за іменем-ключем
p = m.find (name(str));
m.
if (p != m.end())
cout << "Znachennia: " << *p;
else
cout << "Imeni v asociatuvnomy spisky nemae\n";
getch();
return 0;
}
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос по std::map / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]