Loading...
TsenoBorislavovTsenov avatar TsenoBorislavovTsenov 0 Точки

03. Exercises on Pointers, References and Dynamic Memory

Здравейте така и не успях да издокарам output-а на последната задача от домашното ето кода:

 

#include <iostream>
#include <string>
#include <sstream>
#include <list>
#include <conio.h>
#include <vector>
#include <map>
#include <iterator>

struct RANGE
{
	RANGE(const int inputFrom, const int inputTo)
	{
		this->from = inputFrom;
		this->to = inputTo;
	}
	int from;
	int to;
};

inline bool isInRange(const std::map<int, RANGE*> &rangesFrom, const std::map<int, RANGE*> &rangesTo, const int value)
{
	std::map<int, RANGE*>::const_iterator fromIt, toIt;

	fromIt = rangesFrom.upper_bound(value);

	if (fromIt == rangesFrom.begin())
	{
		return false;
	}

	--fromIt;
	toIt = rangesFrom.lower_bound(value);

	if (toIt == rangesFrom.begin())
	{
		return false;
	}

	if (toIt->first == fromIt->first)
	{
		return false;
	}
	return true;
}

int main() 
{
	std::vector<RANGE> ranges;
	std::string input;
	std::istringstream sstr;
	int to(0), from(0), value(0);
	std::map<int, RANGE*> mapFrom, mapTo;
	std::ostringstream ostr;


	while (true)
	{
		std::getline(std::cin, input);
		if ("." == input)
		{
			break;
		}
		sstr.clear();
		sstr.str(input);

		sstr >> from >> to;
		
		RANGE* curr = new RANGE(from, to);
		mapFrom[from] = curr;
		mapTo[to] = curr;
	}

	while (true)
	{
		std::getline(std::cin, input);
		if ("." == input)
		{
			break;
		}
		sstr.clear();
		sstr.str(input);
		sstr >> value;

		if (isInRange(mapFrom, mapTo, value))
		{
			ostr << "in" << '\n';
		}
		else
		{
			ostr << "out" << '\n';
		}
	}

	std::cout << ostr.str();
	
	for (auto it = mapFrom.begin(); it != mapFrom.end(); ++it)
	{
		delete it->second;
		it->second = nullptr;
	}

	_getch();
	return 0;
}

 

0
C++ Programming 12/02/2019 22:05:11
kolioi avatar kolioi 641 Точки
Best Answer

Във функцията isInRange() изчисляваш toIt погрешно - трябва да вземеш rangesTo. Освен това, като сравняваш двата итератора, трябва да вземеш it->second. Ето ти оправения код

inline bool isInRange(const std::map<int, RANGE*> &rangesFrom, const std::map<int, RANGE*> &rangesTo, const int value)
{
	std::map<int, RANGE*>::const_iterator fromIt, toIt;

	fromIt = rangesFrom.upper_bound(value);

	if (fromIt == rangesFrom.begin())
	{
		return false;
	}

	--fromIt;
	toIt = rangesTo.lower_bound(value);

	if (toIt == rangesTo.end())
	{
		return false;
	}

	if (toIt->second == fromIt->second)
	{
		return true;
	}
	return false;
}

Обаче времето за изпълнение е твърде близо до границата и вероятно ще вземеш 80 или 90 от 100 точки в повечето случаи. Затова го пусни няколко пъти :) При мен мина веднъж със 100/100 и няколко пъти по-бавно. Един начин да го направиш по-бързо е като използваш shared_ptr. Ето ти и моето решение само с вектори https://pastebin.com/L5wZAPLW

1
TsenoBorislavovTsenov avatar TsenoBorislavovTsenov 0 Точки

Вашето решение с вектори ми харесва повече, но все пак искам да подкарам и това с маповете.Една колежка от Facebook ми каза да направя същото което и Вие, но получавам debug assertion failed .... Experssion map/set incompatible line 275... 

0
kolioi avatar kolioi 641 Точки

Просто замени функцията isInRange с тази, която ти дадох и трябва да мине.

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.