Профил
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 514 Точки

Във функцията 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 514 Точки

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

0