Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Wyświetlanie zawartości wskaźnika


pypciaR

Rekomendowane odpowiedzi

Opublikowano

Chcę wyświetlić sobie to na co wskazuje shared_ptr

class X
{
public:
   int z;
   int y;
   X(int z, int y):z(z), y(y);
}

int main()
   std::vector<std::shared_ptr<X>> s {};
   int j = 0;
   for(int i = 0; i < 100; ++i)
  {
      std::shared_ptr<X> c = make_shared<X>(i,j);
      s.push_back(c);
      ++j;
   }
   // jakieś operacje dodawania i usuwania elemntów
   for ( const auto &c : s)
      std::cout << c << std::endl;

Chciałbym aby pętla for ta ostatnia coś wyświetliła :D. Próbowałem przeciążać operator << ale to nie pójdzie :P Kod pisany z telefonu więc może być jakiś błąd.

Da się w ogóle w takim przypadku wyświetlić zawartość?

pl ;)

Opublikowano

Jeśli mam być szczery to ten drugi sposób wczoraj robiłem i o dziwo nie działał :D Czemu to nie wiem... Dzisiaj zadziałał. Natomiast źle przeciążałem operator << ponieważ zapomniałem że wskakuje do niego wskaźnik :D, ale dzięki wam :)

pl ;)

Opublikowano

Kontynuując (nie będę kolejnego tematu zakładał)

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <time.h>
#include <memory>
#include <iterator>
#include <list>
using namespace std;

class Karta
{
public:
	int kolor;
	int numer;
	Karta(int kolor, int numer) :kolor(kolor), numer(numer) {};
	int returnKolor();
};
std::ostream &operator<<(std::ostream &str, const std::shared_ptr<Karta> &k)
{
	return str << k->kolor << " " << k->numer;
}
int Karta::returnKolor()
{
	return kolor;
}

void f1()
{
	std::vector<std::shared_ptr<Karta> > s{};
	s.reserve(10000);
	int j = 1;
	for (int i = 0; i < 1000; ++i)
	{
		j = i;
		std::shared_ptr<Karta> c = make_shared<Karta>(i, j);
		s.push_back(c);
	}
	for (int i = 0; i <= 1000; i += 7)
	{
		s.erase(s.begin() + i);
	}
	std::cout << s.size() << std::endl;
	int k = 0;
	for (const auto &c : s)
	{
		k++;
		std::cout << "Element " << k << ". " << c << std::endl;
	}
}
void f2()
{
	std::list<std::shared_ptr<Karta> > s{};
	int j = 0;
	for (int i = 0; i < 10000; i++)
	{
		j = i;
		std::shared_ptr<Karta> c = make_shared<Karta>(i, j);
		s.push_back(c);
	}
	int it = 0;
	for (std::list<std::shared_ptr<Karta> >::iterator i = s.begin(); i != s.end(); ++i)
	{
		if (it % 7 == 0)
			s.erase(i);
		it++;
	}

	for (const auto &c : s)
		std::cout << c << std::endl;
}
void f3()
{
	std::list<std::shared_ptr<Karta> > s{};
	std::vector<std::shared_ptr<Karta> > v{};
	int j = 0;
	for (int i = 0; i < 100; i++)
	{
		j = i;
		std::shared_ptr<Karta> l = make_shared<Karta>(i, j);
		s.push_back(l);
		v.push_back(l);
	}
	int it = 0;
	for (std::list<std::shared_ptr<Karta> >::iterator i = s.begin(); i != s.end(); ++i)
	{
		if (it % 7 == 0)
			s.erase(i);
		it++;
	}

	for (const auto &c : v)
		std::cout << c << std::endl;
}
int main()
{
	clock_t s, f;
	double czas = 0;
	s = clock();
	f3();


	f = clock();
	czas = (double)(f - s) / (double)(CLOCKS_PER_SEC);
	cout << czas << endl;

}

Są 2 pytania do tego kodu.1. Dlaczego po usunięciu elementów z vectora wyrzuca mi tylko elementy do 9795. Nie rozumiem, wiem że jak usunie 7 element to wskakuje na jego miejsce element 8, ale dlaczego nie ma liczb od 9795 do 9999 ? 

2. Dlaczego program wywala się na f3() chciałem podzielić sobie wskaźnik. Vector tylko wyświetlać, natomiast z listy tylko usuwać elementy.

pl ;)

Opublikowano

Od samego czytania tej copypaste robi sie niedobrze :X

 

f3 wywala bo operacja usuwania moze (i w twoim wypadku tak najprawdopodobniej jest) uniewaznic iterator... Przeczytaj co zwraca erase().

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...