list::merge assertion

Intrebari despre programarea cu VC++ incluzand mediul de dezvoltare, instalare, setari, debugger, compilator, linker si documentatie.
Post Reply
User avatar
mihk
Junior
Junior
Posts: 39
Joined: 03 Jul 2009, 14:51

list::merge assertion

Post by mihk » 03 Mar 2012, 19:14

Code: Select all

#include <list>
#include <stdlib.h>

const int iSize = 300;
int main()
{
	srand(600);
	
	std::list<int> perflist1, perflist2;
	for(int i=0; i<iSize; ++i)
	{
		perflist1.push_back( rand() % (iSize/2) );
		perflist2.push_back( rand() % (iSize/2) );
	}
	perflist1.merge(perflist2);
	
	return 0;
}
Primesc un assert, numai pe debug, cu VS9.
Ma intreb daca si pe alte PC-uri se intampla. Daca voi vedeti unde e buba, poate imi spuneti si mie.
Multam.
Attachments
list_merge_assert.png
list_merge_assert.png (20.92 KiB) Viewed 3493 times


Caut profesor.

User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: list::merge assertion

Post by bu7ch3r » 03 Mar 2012, 20:04

Salut,

In primul rand te incurajez sa folosesti regula RTFM atunci cand programezi :)

Assertul iti zice el cam care e buba :) Iti spune ca secventa nu e sortata. Merge(metoda) nu merge(verbul) pe liste alandala, trebuie sa fie sortate.

Daca faci perflist1.sort() si perflist2.sort() apoi merge(metoda), perflist1 o sa aibe elementele din perflist2 sortate si o sa scapi de assert.

Citeste documentatia si apoi joaca-te cu listele :)
http://msdn.microsoft.com/en-us/library ... s.80).aspx(mai sunt metode utile acolo, cum ar fi unique())

A, si assertul, apare numai pe debug(n-are treaba cu calculatorul sau cu versiunea de VS) ca sa anunte programatorul(pe tine) ca s-ar putea sa faca o magarie. Pe release nu-ti zice nimic pentru ca are incredere in tine ca faci ceea ce faci intentionat ;)

L.E. Daca vrei sa ai in perflist1 si ce are perflist2 nu folosi merge(metoda) foloseste splice(metoda).
Cu stima,
Lupu Claudiu

User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: list::merge assertion

Post by bu7ch3r » 03 Mar 2012, 20:23

Si inca ceva, de ce nu dai seed-ul direct 150 ? Ce treaba are ca faci %(modulo, operator) dispersia e aceeasi nu ?
Cu stima,
Lupu Claudiu

User avatar
mihk
Junior
Junior
Posts: 39
Joined: 03 Jul 2009, 14:51

Re: list::merge assertion

Post by mihk » 03 Mar 2012, 21:27

Am inteles unde e buba, dar e de PORC sa inchizi un program pentru o eroare logica.
Aici cu perflist1.sort() e usor.
Am insa un cod in care iterez intr-un tree cu:
while( it != ite ) { ... }
si unde iteratorii apartin unor liste diferite. Acolo e mai dificil sa acolesc it != ite.
In fine, am ales sa-mi scriu containerele de care am nevoie.
Probabil era mai simplu sa schimb STL-ul cu totul, dar sunt convins ca si alternativele au luat-o pe carari oculte.
Caut profesor.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi

Re: list::merge assertion

Post by Ovidiu Cucu » 03 Mar 2012, 21:39

mihk wrote:Am inteles unde e buba, dar e de PORC sa inchizi un program pentru o eroare logica.
Nu, nu e "de PORC".
ASSERT-ul s-a inventat tocmai pentru a trage de maneca programatorul in faza de DEBUG, cum ca a facut oaresce greseala de programare.

User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: list::merge assertion

Post by bu7ch3r » 03 Mar 2012, 22:28

Cu iteratorii trebuie sa ai grija :) atunci cand folosesti merge pentru ca iteratorul acceseaza adresa nu indexul :)
Daca ai de exemplu 1 5 7 si 2 3 si iteratorul care pentru prima lista l-ai dus pana la 5; dupa ce faci merge sau orice alte operatii care altereaza lista 1, iteratorul o sa fie tot pe 5 chiar daca in cazul lui merge lista o sa fie 1 2 3 5 7.
Cu stima,
Lupu Claudiu

User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: list::merge assertion

Post by bu7ch3r » 03 Mar 2012, 22:36

Liste si tree si iteratori la tree ?
Vrei sa inlocuiesti STL-ul ? Cu ce ? Iti faci MTL(Mihk Template Library)-ul tau :) - STL-ul e bun bun, ai tot ce-ti trebuie trebuie doar sa inveti ce-ti ofera si cum sa le folosesti:)
Cu stima,
Lupu Claudiu

User avatar
mihk
Junior
Junior
Posts: 39
Joined: 03 Jul 2009, 14:51

Re: list::merge assertion

Post by mihk » 04 Mar 2012, 01:42

sort-ul ala din lista, e un merge_sort. Foloseste intern merge, splice si swap.
Cred ca merge a ajuns in lista datorita lui sort. Altfel splice era suficient.
Personal, mi-a fost mai usor sa scriu un list, decat sa modific un tree.
Ca ideie, daca ati folosit un tree care are postorder, preorder, levelorder traversal si e suficient de bun, sa-mi spuneti si mie.
Am gasit vreo 2 pe net, insa incomplete.
Caut profesor.

User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: list::merge assertion

Post by bu7ch3r » 05 Mar 2012, 13:34

Cred ca sortul din lista e quick_sort (n(logn)) din nou, citeste manualul :)
Cu stima,
Lupu Claudiu

User avatar
mihk
Junior
Junior
Posts: 39
Joined: 03 Jul 2009, 14:51

Re: list::merge assertion

Post by mihk » 05 Mar 2012, 20:34

c:\Program Files\Microsoft Visual Studio 9.0\VC\include\list

Code: Select all

void sort()
{	// order sequence, using operator<
	if (2 <= _Mysize)
	{	// worth sorting, do it
	const size_t _MAXBINS = 25;
	_Myt _Templist(this->_Alval), _Binlist[_MAXBINS + 1];
	size_t _Maxbin = 0;

	while (!empty())
	{	// sort another element, using bins
		_Templist._Splice(_Templist.begin(), *this, begin(),
			++begin(), 1, true);	// don't invalidate iterators

		size_t _Bin;
		for (_Bin = 0; _Bin < _Maxbin && !_Binlist[_Bin].empty();
			++_Bin)
			{	// merge into ever larger bins
			_Binlist[_Bin].merge(_Templist);
			_Binlist[_Bin].swap(_Templist);
			}

		if (_Bin == _MAXBINS)
			_Binlist[_Bin - 1].merge(_Templist);
		else
			{	// spill to new bin, while they last
			_Binlist[_Bin].swap(_Templist);
			if (_Bin == _Maxbin)
				++_Maxbin;
			}
	}

	for (size_t _Bin = 1; _Bin < _Maxbin; ++_Bin)
		_Binlist[_Bin].merge(_Binlist[_Bin - 1]);	// merge up
	splice(begin(), _Binlist[_Maxbin - 1]);	// result in last bin
	}
}
@bu7ch3r, apreciez faptul ca ma trimiti mereu la RTFM. :)
Deci, everyone, bucata de mai sus e quicksort ?
Caut profesor.

User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: list::merge assertion

Post by bu7ch3r » 06 Mar 2012, 01:33

Nu e nici una nici alta, acum ce ne facem :)) Tim sau Intro ?
Cu stima,
Lupu Claudiu

Post Reply