Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2017, 21:25   #1
olegla
Пользователь
 
Регистрация: 01.06.2017
Сообщений: 15
По умолчанию Хеш таблица, групировка значений

У меня есть файл с значеними( записаные в вектор):
"a", "d", "s", "s", "n";
"", "d", "s", "", "n"
"a", "", "s", "", "n"
"", "d", "s", "", "n"
"a", "", "s", "", "n"
"a", "d", "s", "s", "n"
И мне нужно написать функцию которая будет зчитывать с файла,групировать групы и записывать их в хештаблицу и выводить на екран
например 1 рядка и 6 рядка у них однаковые значения
3 та 5 однаковые, 2 та 4 однаковые.
С файла я смогу написать програму чтобы считывало и выводило на екран. но как с хеш таблицей работать я не могу понять.
Я написал функци. для подщета и проверки не пуста ли колонка
Код:
size_t CalcHash(const Material& material)
{
	size_t hash = 0;
	if (!material.m_AmbientMapName.empty())
		hash += 1;
	if (!material.m_DiffuseMapName.empty())
		hash += 2;
	if (!material.m_NormalMapName.empty())
		hash += 3;
	if (!material.m_ShininessMapName.empty())
		hash += 4;
	if (!material.m_SpecularMapName.empty())
		hash += 5;

		return hash;
}
Моя функция:
Код:
std::vector GroupMaterial(std::vector objects)
{
	std::vector g_O_material;
	..............

	return g_O_material;
}
olegla вне форума Ответить с цитированием
Старый 06.06.2017, 09:18   #2
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

std::map
std::unordered_map


одно из них дерево, а второе - натуральный хэш. На выбор.
alexzk вне форума Ответить с цитированием
Старый 06.06.2017, 13:07   #3
olegla
Пользователь
 
Регистрация: 01.06.2017
Сообщений: 15
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
std::map
std::unordered_map


одно из них дерево, а второе - натуральный хэш. На выбор.
я так уже сделал:
Код:
std::vector<std::vector<std::shared_ptr<GameObject>>> GroupGameObjectsByMaterial(std::shared_ptr<std::vector<std::shared_ptr<GameObject>>> gameObjects)
{
	for (std::shared_ptr<GameObject> gameObject : *gameObjects)
	{
		std::sort(*gameObjects->begin(), *gameObjects->end(), Comp);
	}
	std::vector<std::vector<std::shared_ptr<GameObject>>> gameObjectsByMaterial;
	gameObjectsByMaterial.reserve(gameObjects->size);

	for (auto it = gameObjects->begin(); it != gameObjects->end(); ++it)
	{
		if (it != gameObjectsByMaterial[gameObjectsByMaterial.size - 1])
		{
			gameObjectsByMaterial.push_back(it);
		}
	}
	return gameObjectsByMaterial;
}
но есть ошибки. посмотрите что не так
olegla вне форума Ответить с цитированием
Старый 06.06.2017, 16:59   #4
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от olegla Посмотреть сообщение
я так уже сделал:
Код:
std::vector<std::vector<std::shared_ptr<GameObject>>> GroupGameObjectsByMaterial(std::shared_ptr<std::vector<std::shared_ptr<GameObject>>> gameObjects)
{
	for (std::shared_ptr<GameObject> gameObject : *gameObjects)
	{
		std::sort(*gameObjects->begin(), *gameObjects->end(), Comp);
	}
	std::vector<std::vector<std::shared_ptr<GameObject>>> gameObjectsByMaterial;
	gameObjectsByMaterial.reserve(gameObjects->size);

	for (auto it = gameObjects->begin(); it != gameObjects->end(); ++it)
	{
		if (it != gameObjectsByMaterial[gameObjectsByMaterial.size - 1])
		{
			gameObjectsByMaterial.push_back(it);
		}
	}
	return gameObjectsByMaterial;
}
но есть ошибки. посмотрите что не так
Какие ошибки? Я ж не телепат.
Смотрю, вы изменили прототип на указатели. Копии замучали? Можно было вот так, и мороки меньше:

Код:

std::vector GroupMaterial(const std::vector<GameObject>& objects) //ссылка (тоже, что и указатель, но на стеке)
{
	std::vector g_O_material;
        
        for (const auto& gameObject: objects) //ссылка, или для старых for (const GameObject& gameObject: objects)
        {
        }

	return g_O_material;
}
слово const расставить по желанию - оно не дает делать модификации, только читать. Если вам не нужно менять - ставьте - хороший тон (у меня были случаи, когда правильно расставленые const сразу в 2 раза ускоряли программу, потому что это сильная подсказка оптимизатору).

у вас вроде так нада: gameObjectsByMaterial.push_back(*it );

Последний раз редактировалось alexzk; 06.06.2017 в 17:04.
alexzk вне форума Ответить с цитированием
Старый 06.06.2017, 17:23   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
у меня были случаи, когда правильно расставленые const сразу в 2 раза ускоряли программу, потому что это сильная подсказка оптимизатору
А может от того, что вы советуете расставлять их по желанию? Если в таком форе
Код:
for(auto& gameObject: objects)
итерируемый объект окажется константным (например, ключ в мепе), то компилятор сделает вам копию-временный объект. И да, в этом случае добавления const действительно сильно ускорить цикл.
p51x вне форума Ответить с цитированием
Старый 06.06.2017, 18:31   #6
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
А может от того, что вы советуете расставлять их по желанию? Если в таком форе
Код:
for(auto& gameObject: objects)
итерируемый объект окажется константным (например, ключ в мепе), то компилятор сделает вам копию-временный объект. И да, в этом случае добавления const действительно сильно ускорить цикл.
...ну я собссно чужой код ускорял А советую "по желанию", потому что не хочу читать лекции. Заработало бы и без него, но код плохой.
alexzk вне форума Ответить с цитированием
Старый 06.06.2017, 18:54   #7
olegla
Пользователь
 
Регистрация: 01.06.2017
Сообщений: 15
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
Какие ошибки? Я ж не телепат.
Смотрю, вы изменили прототип на указатели. Копии замучали? Можно было вот так, и мороки меньше:

Код:

std::vector GroupMaterial(const std::vector<GameObject>& objects) //ссылка (тоже, что и указатель, но на стеке)
{
	std::vector g_O_material;
        
        for (const auto& gameObject: objects) //ссылка, или для старых for (const GameObject& gameObject: objects)
        {
        }

	return g_O_material;
}
слово const расставить по желанию - оно не дает делать модификации, только читать. Если вам не нужно менять - ставьте - хороший тон (у меня были случаи, когда правильно расставленые const сразу в 2 раза ускоряли программу, потому что это сильная подсказка оптимизатору).

у вас вроде так нада: gameObjectsByMaterial.push_back(*it );
1) Severity Code Description Project File Line Suppression State
Error C2664 'void std::vector<std::vector<std::shared _ptr<GameObject>,std::allocator<_Ty >>,std::allocator<std::vector<_Ty,s td::allocator<_Ty>>>>:ush_back(co nst std::vector<_Ty,std::allocator<_Ty> > &)': cannot convert argument 1 from 'std::shared_ptr<GameObject>' to 'std::vector<std::shared_ptr<GameOb ject>,std::allocator<_Ty>> &&' GameLoader 65
2)Severity Code Description Project File Line Suppression State
Error C2678 binary '!=': no operator found which takes a left-hand operand of type 'std::_Vector_iterator<std::_Vector _val<std::_Simple_types<std::shared _ptr<GameObject>>>>' (or there is no acceptable conversion) GameLoader 63
3)Severity Code Description Project File Line Suppression State
Error (active) no instance of overloaded function "std::vector<_Ty, _Alloc>:ush_back [with _Ty=std::vector<std::shared_ptr<Gam eObject>, std::allocator<std::shared_ptr<Game Object>>>, _Alloc=std::allocator<std::vector<s td::shared_ptr<GameObject>, std::allocator<std::shared_ptr<Game Object>>>>]" matches the argument list GameLoader 65
4) Severity Code Description Project File Line Suppression State
Error (active) no operator "!=" matches these operands GameLoader 63

кричит на эти строки:
Код:
gameObjectsByMaterial.push_back(*it);
Код:
if (it != gameObjectsByMaterial[gameObjectsByMaterial.size() - 1])
olegla вне форума Ответить с цитированием
Старый 06.06.2017, 18:56   #8
olegla
Пользователь
 
Регистрация: 01.06.2017
Сообщений: 15
По умолчанию

Тоесть на этот иф:
Код:
if (it != gameObjectsByMaterial[gameObjectsByMaterial.size() - 1])
		{
			gameObjectsByMaterial.push_back(*it);
		}
olegla вне форума Ответить с цитированием
Старый 06.06.2017, 19:40   #9
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Да там уже у вас помесь нипонять чего. Оторвитесь. Сегодня почитайте какие-нибудь сказки. Завтра будете читать код.

У вас уже не код, а компот из яблок, слив и лошадей.
alexzk вне форума Ответить с цитированием
Старый 06.06.2017, 19:42   #10
olegla
Пользователь
 
Регистрация: 01.06.2017
Сообщений: 15
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
Да там уже у вас помесь нипонять чего. Оторвитесь. Сегодня почитайте какие-нибудь сказки. Завтра будете читать код.

У вас уже не код, а компот из яблок, слив и лошадей.
увы, но сегодня нужно выслать лабу(
а что там не так? я проверяю не однаковые ли они. и записываю в вектор.
olegla вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хеш-таблица и хеш-функция. Проверка на ввод существующих данных F1nt Общие вопросы C/C++ 0 24.01.2014 09:52
Хеш таблица C++ Jirogirg Общие вопросы C/C++ 19 24.08.2012 22:15
хеш-таблица CHUCKe Помощь студентам 2 17.11.2010 23:30
ХЕШ-таблица iceman2112 Общие вопросы C/C++ 0 09.05.2010 13:07
Групировка значений и их сумма, но с условием psbad Microsoft Office Excel 23 19.11.2009 11:00