powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Поиск в map.
25 сообщений из 26, страница 1 из 2
Поиск в map.
    #39057524
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, коллеги!
Не могу победить эту ересь, помогите плиз.
Часов 5 уже убил.
Есть цикл, в котором одна колонка повторяется(mored_path.employeeID).
Мне надо, эти значения засунуть в 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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
					Цикл {
					....
					....
					mail_empl_find.employeeID = mored_path.employeeID;
					mail_empl = NULL;
					mail_empl = &mail_empl_find;
					/*if (!mail_step_map.empty()) // Проверка на инициализацию
					{
						map<char*, int>::iterator it_empl = mail_step_map.find(mored_path.employeeID); 
						if(it_empl != mail_step_map.end()) // Проверка на существование ID
						{
							 mail_step_map.erase(mored_path.employeeID);// Удаляем дублирующийся ID
							 mail_step_map[mored_path.employeeID] = 1;
							 break;
						}
					}*/
					/*
					if (!mail_step_map.empty()) // Проверка на инициализацию
					{
						map<char*, int>::iterator itr = mail_step_map.begin();
						while (itr != mail_step_map.end()) 
						{
							if (itr->first == mail_empl->employeeID) 
							{
								mail_step_map.erase(itr++);
							}
						}
					}*/
					/*if (!mail_step_map.empty()) // Проверка на инициализацию
					{
						std::map<char*,int>::iterator it;
						for (it=mail_step_map.begin(); it!=mail_step_map.end(); ++it)
						{
							if (it->first == mored_path.employeeID)
							{
								std::cout << it->first << " => " << it->second << '\n';
							}
						}
					}*/
					if (!mail_step_map.empty()) // Проверка на инициализацию
					{
						map<char*, int>::iterator it = mail_step_map.find(mored_path.employeeID); 
						if (it != mail_step_map.end())
						{
							it->second = 2;
							cout << "nafonfa" << endl;
						}
					}
					mail_step_map[mored_path.employeeID] = 1;
				}

...
Рейтинг: 0 / 0
Поиск в map.
    #39057528
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такую проверку я уже делал, там проблем не было. А тут на тебе и убил полдня.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
					map<char*, char*>::iterator it = step_map.find(mored_execution_out->ip); 
					if(it != step_map.end()) // Проверка на существование этого IP адреса
					{
						 char* idx = it->second;
						 stmt3->setInt(1, atoi(idx));//insert FINISH status
						 stmt3->executeUpdate();
						 conn->commit();
						 step_map.erase(mored_execution_out->ip);// Удаляем использованную IP
					}
...
Рейтинг: 0 / 0
Поиск в map.
    #39057536
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipok, у тебя вообще где итератор двигается? Где it++ ?
...
Рейтинг: 0 / 0
Поиск в map.
    #39057547
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonvadipok, у тебя вообще где итератор двигается? Где it++ ?

Везде же есть. Посмотрите внимательнее. Там несколько попыток.
Например один взять отсюда тынц .
...
Рейтинг: 0 / 0
Поиск в map.
    #39057549
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если не путаю - проблема тут
Код: plaintext
1.
map<char*, int>


у тебя в индексе не строки, а указатели, т.е. адреса.

надо переделать на
Код: plaintext
1.
map<string, int>


или
Код: plaintext
1.
map<char[10], int>
...
Рейтинг: 0 / 0
Поиск в map.
    #39057550
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По сути в отличие между рабочим и не рабочим только в этом
Код: plaintext
1.
2.
map<char*, char*>::iterator it
map<char*, int>::iterator it
...
Рейтинг: 0 / 0
Поиск в map.
    #39057552
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Ага спасибо, вы успели раньше написать.
В принципе я предполагал что в этом проблема.
...
Рейтинг: 0 / 0
Поиск в map.
    #39057556
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЕсли не путаю - проблема тут
Код: plaintext
1.
map<char*, int>


у тебя в индексе не строки, а указатели, т.е. адреса.

надо переделать на
Код: plaintext
1.
map<string, int>


или
Код: plaintext
1.
map<char[10], int>



Стоп!

А почему тут не возникала такая проблема:
Код: plaintext
1.
map<char*, char*>::iterator it
...
Рейтинг: 0 / 0
Поиск в map.
    #39057562
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipok, кормишь нас с ложечки сорцами. На даёшь тебе помочь.
...
Рейтинг: 0 / 0
Поиск в map.
    #39057566
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokСтоп!

А почему тут не возникала такая проблема:
Код: plaintext
1.
map<char*, char*>::iterator it


Вполне возможно там адреса были постоянны, например ссылки на другой мап. Просто не успело сглючить :)
...
Рейтинг: 0 / 0
Поиск в map.
    #39057580
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, понравилась формулировка.
Просто не успело сглючить :)
...
Рейтинг: 0 / 0
Поиск в map.
    #39057583
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уже не смеюсь.
В С++ перестал удивляться всему.
...
Рейтинг: 0 / 0
Поиск в map.
    #39057609
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokВ С++ перестал удивляться всему.
При чём тут С++ когда ты тупо плаваешь в устройстве компьютера и работе с памятью?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Поиск в map.
    #39057647
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipok, немного не по теме.

Просто совет. С мапом удобнее так работать
Код: plaintext
1.
2.
3.
4.
typedef std::map<char*, int> mail_step_map_t;
mail_step_map_t mail_step_map;
...
mail_step_map_t::iterator it = ...



И второй вопрос: employeeID у тебя строка зачем? Там реально текст или "так получилось"? Если второе, то лучше вернись к int.
...
Рейтинг: 0 / 0
Поиск в map.
    #39057649
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Ну а почему он тут работает корректно?
Код: plaintext
1.
map<char*, char*>::iterator it



Я не спорю, я полный профан в С++.
Просто такие приколы выводят из колеи.
...
Рейтинг: 0 / 0
Поиск в map.
    #39057653
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tvadipok, немного не по теме.

Просто совет. С мапом удобнее так работать
Код: plaintext
1.
2.
3.
4.
typedef std::map<char*, int> mail_step_map_t;
mail_step_map_t mail_step_map;
...
mail_step_map_t::iterator it = ...



И второй вопрос: employeeID у тебя строка зачем? Там реально текст или "так получилось"? Если второе, то лучше вернись к int.

Там char*.
Это два разных места, рабочий вариант на своем месте, и работает он корректно.
...
Рейтинг: 0 / 0
Поиск в map.
    #39057657
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokНу а почему он тут работает корректно?
Эта строка ничего не делает и не показывает время жизни значений по ссылкам. Так что
единственное объяснение почему она работает - "дуракам везёт".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Поиск в map.
    #39057663
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovvadipokНу а почему он тут работает корректно?
Эта строка ничего не делает и не показывает время жизни значений по ссылкам. Так что
единственное объяснение почему она работает - "дуракам везёт".

Вот я и упоролся на пол дня.
Придется рабочий вариант тоже переделать.
Всем спасибо!
...
Рейтинг: 0 / 0
Поиск в map.
    #39057668
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokработает он корректно.
Он работает только потому что ты случайно соблел правила не понимая их. Как только ты правила нарушишь - работать перестанет.
Вот тебе пример для медитации
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
typedef std::map<char*, int> test_t;
test_t test_map;

void test()
{
	char* x = "test";
	test_map[x] = 1;
	char* y = x;
	char z[5];
	strcpy(z, x);
	if(test_map.find(x) != test_map.end()) printf("found x\n");
	if(test_map.find(y) != test_map.end()) printf("found y\n");
	if(test_map.find(z) == test_map.end()) printf("Not found z\n");
}

Результатfound x
found y
Not found z
Потрать время, пойми почему так.
...
Рейтинг: 0 / 0
Поиск в map.
    #39057683
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обрати внимание на мой вопрос
Dima TИ второй вопрос: employeeID у тебя строка зачем? Там реально текст или "так получилось"? Если второе, то лучше вернись к int.
Этим ты порешаешь текущие проблемы и, скорее всего, будущие.
...
Рейтинг: 0 / 0
Поиск в map.
    #39057699
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokВот я и упоролся на пол дня.
Придется рабочий вариант тоже переделать.
Специально для таких случаев были изобретены языки без указателей: Java, PHP, Perl, Lua.
Последний для работы с map весьма рекомендую.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Поиск в map.
    #39057757
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokУже не смеюсь.
В С++ перестал удивляться всему.

Если хотите не удивляться и понять почему так
гляньте еще раз в примеры из документации .

авторstd::map<char,int> ::key_compare ......




Ваш код исключает повторение одной и тойже строки
(области памяти) в разных парах.

Но разные строки ( области памяти)
с одинаковым текстом ( дубли ) он исключать не будет.
...
Рейтинг: 0 / 0
Поиск в map.
    #39057876
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokDimitry Sibiryakov,

Ну а почему он тут работает корректно?
Код: plaintext
1.
map<char*, char*>::iterator it



Я не спорю, я полный профан в С++.
Просто такие приколы выводят из колеи.

Он не работает, просто тебе кажется, что он работает.

И на самом деле ты даже можешь очень аккуратно работать с этим кодом, и он БУДЕТ работать в ограниченных случаях, главное -- знать, что делаешь и границы не переходить.
Это ж по сути -- таблица атомов.
...
Рейтинг: 0 / 0
Поиск в map.
    #39057877
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А мне не нравится сам алгоритм.
Эту портянку не читал даже -- там должно быть всё короче и проще.

авторЕсть цикл, в котором одна колонка повторяется(mored_path.employeeID).
Мне надо, эти значения засунуть в map, исключив дубли.

Чтобы это сделать , надо тупо пройтись по всем записям и каждое значение положить в map, а он
уже там сам разберётся, где там уникальное, где -- нет, и на выходе даст список уникальных.
Нужно только не забыть и правильно определить std::less для ключей -- хотя для строк это уже сделано.
...
Рейтинг: 0 / 0
Поиск в map.
    #39058248
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЧтобы это сделать , надо тупо пройтись по всем записям и каждое значение положить в map, а он
уже там сам разберётся, где там уникальное, где -- нет, и на выходе даст список уникальных.
Нужно только не забыть и правильно определить std::less для ключей -- хотя для строк это уже сделано.

+100500, работает.
Код: plaintext
1.
2.
3.
4.
5.
6.
					std::string str(mored_path.employeeID);
					if (!mail_step_map.empty()) // Проверка на инициализацию
					{
						mail_step_map[str] = 1;
					}
					mail_step_map[str] = 1;
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Поиск в map.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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