Προς το περιεχόμενο

Σχετικα με vectors και pointing


Evgenios1

Προτεινόμενες αναρτήσεις

Δημοσ.

Υπαρχει τροπος δυο vector να δειχνουν το ιδιο πραγμα;

εστω οτι vector x {1,2,3,5,6,7,8} γινετε ενας αλλος vector να δειχνει πχ το 3,4,5;

Ολα αυτα χωρις χρηση των smart pointers.

Δημοσ.
Υπαρχει τροπος δυο vector να δειχνουν το ιδιο πραγμα;

εστω οτι vector x {1,2,3,5,6,7,8} γινετε ενας αλλος vector να δειχνει πχ το 3,4,5;

Ολα αυτα χωρις χρηση των smart pointers.

 

Γιατί πιο είναι το πρόβλημα με τα SmartPtrs??? Ο επίσημος τρόπος είναι αυτός όλα τα υπόλοιπα θα είναι patchies άρα προφανώς λάθος.

Δημοσ.

Προσπαθω να φτιαξω μια βιβλιοθηκη με παρομοια τεχνολογια σαν της .net (Linq) και εχω σκαλωσει στο "where". Το υλοποιω με vectors για αυτο και εχω αυτη την απορια.

 

εδω η συναρτηση where

>Vector<T> Where(std::function<bool(T)> expr)
{
	//std::vector<smart_it> result;
	Vector<T> result;
	_it f= this->begin();
	_it l= this->end();
	for(;f!=l;++f)
		if(expr(*f))
			result.push_back(*f);
	return result;
}

Με τη παραπανω μεθοδο κανω copy και κατασκευαζω εναν νεο vector αλλα εγω θελω αυτος ο νεος vector να δειχνει τα δεδομενα που δειχνει ο κυριος vectro (τα φιλτραρισμενα δεδομενα)

 

ολη η κλαση ειναι αυτη

>#pragma once
#ifndef _SVECTOR_HPP_
#define _SVECTOR_HPP_


#include <vector>
#if _HAS_TR1
#include <functional>
#include <algorithm>
#include <memory>
namespace linq
{

template <class T>
class Vector 
: public std::vector<T>
{
typedef std::vector<T>::iterator _it;
//typedef std::shared_ptr<T> smart_it;
public:
//Vector<T>(std::vector<T> &vec){}
bool Exist(T& obj)
{
	bool res= false;
	this->Foreach([&res,&obj](T &t)
	{
		if(obj==t)
			res = true;
	});
	return res;
}
Vector<T> Where(std::function<bool(T)> expr)
{
	//std::vector<smart_it> result;
	Vector<T> result;
	_it f= this->begin();
	_it l= this->end();
	for(;f!=l;++f)
		if(expr(*f))
			result.push_back(*f);
	return result;
}
Vector<T> Select()
{
	return Vector<T>(*this);
}
Vector<T> Select(std::function<void(T&)> _func)
{
	Vector<T> result(*this);
	result.Foreach(_func);
	return result;
}

//temp
Vector<T> Sort()
{
	std::sort(this->begin(),this->end());
	return *this;
}
//temp
Vector<T> Sort(std::function<bool(T&,T&)> _pred)
{
	std::sort(this->begin(),this->end(),_pred);
	return *this;
}
//temp
Vector<T> Foreach(std::function<void(T&)> _func)
{
	std::for_each(this->begin(),this->end(),_func);
	return *this;
}
//temp;
Vector<T> Remove()
{
	this->clear();
	return *this;
}
};
}
#else
 #error "need tr1"
#endif
#endif

 

και το λαθος που προκυπτει, εφοσον ειναι μια copια, ειναι στο παρακατω

 

>#include <iostream>
#include <String>

#include "svector.hpp"
using namespace linq;
using namespace std;
#define _p [](int& t){cout<<t<<endl;}
int main(void)
{


Vector<int> obj;
   for(int i=0;i<100;i++)
	obj.push_back(std::rand());


obj.Where([](int& t)->bool
{
	if(t%2==0)
		return true;
	return false;
})[color="Red"].Remove()[/color]
	.Foreach(_p);
 



return 0;
}

Εαν οι iterators δειχναν τα ιδια δεδομενα τοτε το remove εβγαζε ολους τους αρτιους αριθμου. Κατι που δε γινεται... λογο οτι επιστρεφει μια copia και οχι αυτα που υπαρχουν στο κυριο vector.

Δημοσ.

Θα κανεις μια καινούρια κλάση που θα περιέχει έναν SmrtPtr ο οποιος θα κοιτάει στο shared vector σου. Αυτή η κλάση θα έχει εκτος από το SmartPtr το range τον στοιχείον που θα μπορεί να δίνει στον χρηστη, θα φτιάξεις τις κατάλληλες μεθόδους ίσος κανεις overload τον operator [] για να μοιάζει πολύ στον vector. Ktlves τι ενοώ??

 

>template<class T>
class SharedVector{
 private:
   SmartPtr<vector<T> > _vector;
   unsigned int _startPos;
   unsigned int _endPos;
 public:
   SharedVector(const SharedVector<T>& sharedVector,unsigned int startPos, unsigned int endPos)throw(KapioException gia lathos arguments);
   SharedVector<T> GetElements(unsigned int startPos, unsigned int endPos)throw(KapioException gia lathos arguments);
   const T& operator [] (unsigned int pos)tthrow(KapioException gia lathos arguments);
   ~SharedVector();
};

Δημοσ.
Θα κανεις μια καινούρια κλάση που θα περιέχει έναν SmrtPtr ο οποιος θα κοιτάει στο shared vector σου. Αυτή η κλάση θα έχει εκτος από το SmartPtr το range τον στοιχείον που θα μπορεί να δίνει στον χρηστη, θα φτιάξεις τις κατάλληλες μεθόδους ίσος κανεις overload τον operator [] για να μοιάζει πολύ στον vector. Ktlves τι ενοώ??

 

>template<class T>
class SharedVector{
 private:
   SmartPtr<vector<T> > _vector;
   unsigned int _startPos;
   unsigned int _endPos;
 public:
   SharedVector(const SharedVector<T>& sharedVector,unsigned int startPos, unsigned int endPos)throw(KapioException gia lathos arguments);
   SharedVector<T> GetElements(unsigned int startPos, unsigned int endPos)throw(KapioException gia lathos arguments);
   const T& operator [] (unsigned int pos)tthrow(KapioException gia lathos arguments);
   ~SharedVector();
};

 

Τελικά το λύσαμε η όχι?

Δημοσ.
Οχι ρε φιλε :cry: . Ξερεις κανα καλο οδηγο για κατασκευη container & iterator ; Δεν βρηκα κατι ολοκλυρωμενο στο net.

 

E μήπως δη κατάλαβες αυτό που έγραψα?? Η κατασκευή του container είναι πολύ απλή αν ξέρεις τα templates, για iterator δες το iterator design pattern. Γενικός ήθελες ακριβώς αυτό που έγραψα αλλα δεν καταλαβαίνω τι πρόβλημα έχεις.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...