swappen von großen statischen Arrays



  • Kann man effizient statische Arrays swappen?

    class test
    {
       GrosserDatentypMitAufwändigemKopierkonstruktor array[SehrGrosseZahl];
    };
    

    Einfach zeiger tauschen geht hier ja nicht. Ich muss hier eine effiziente swap funktion für die Klasse "test" schreiben, die ich zur Verfügung gestellt bekommen habe und nicht ändern kann.
    Gibt es dabei eine "Standard" Vorgehensweise?



  • Hat GrosserDatentypMitAufwändigemKopierkonstruktor eine effiziente swap-Funktion? Wenn ja, kannst Du die ja SehrGrosseZahl mal aufrufen. Was anderes, ohne die Klasse test zu verändern, gibt's nicht.

    Wenn das nicht schnell genug ist oder du die Klasse test ändern darfst, würde ich die folgendes empfehlen:

    class test
    {
       vector<GrosserDatentypMitAufwändigemKopierkonstruktor> array;
       ...
    public:
       ...
    
       friend void swap(test & a, test & b) {
          a.array.swap(b.array);
          ...
       }
    };
    

    Gruß,
    SP



  • Statische Arrays musst du in linearer Zeit tauschen.

    Das einzige, was du machen kannst, ist die Klasse test dynamisch anzulegen und somit deren Zeiger zu tauschen. Ich empfehle eine Wrapper-Klasse:

    class test_wrapper
    {
    	public:
    		test_wrapper()
    		: m_test(new test())
    		{
    		}
    
    		test_wrapper(const test_wrapper& origin)
    		: m_test(new test(*origin.m_test))
    		{
    		}
    
    		test_wrapper::~test_wrapper()
    		{
    			delete m_test;
    		}
    
    		test_wrapper& operator= (const test_wrapper& other)
    		{
    			test_wrapper tmp(other);
    			swap(tmp);
    		}
    
    		void swap(test_wrapper& other)
    		{
    			std::swap(m_test, other.m_test);
    		}
    
    		// hier zusätzlich Schnittstelle von test
    		// bereitstellen und Aufrufe an m_test weiterleiten
    
    	private:
    		test* m_test;
    };
    


  • Im Prinzip geht es um die WIN32_FIND_DATA Structure (http://msdn.microsoft.com/en-us/library/aa365740(VS.85).aspx).
    Da kommen ja zwei TCHAR-Arrays drin vor. Die wollte ich swappen (da ich eine lange liste von Files habe (ca. 10.000) und die über swap sortieren will. Daher kann ich an der Klasse an sich nichts ändern.

    Auf die Idee, WIN32_FIND_DATA einfach dynamisch in meiner Klasse anzulegen, bin ich garnicht gekommen. Ich muss mal ausprobieren, ob sich dadurch ein geschwindigkeitsvorteil ergibt

    class test
    {
        WIN32_FIND_DATA* p;
    };
    inline void swap(test& a, test& b)
    {
        WIN32_FIND_DATA* tmp = a.p;
        a.p = b.p
        b.p = tmp;
    }
    


  • Foxxy schrieb:

    class test
    {
        WIN32_FIND_DATA* p;
    };
    inline void swap(test& a, test& b)
    {
        WIN32_FIND_DATA* tmp = a.p;
        a.p = b.p
        b.p = tmp;
    }
    

    Das würde ich aber die Klasse selbst übernehmen lassen, um die Kapselung zu erhalten (siehe mein oberes Beispiel). Von aussen kannst du immer noch eine globale swap() -Funktion bereitstellen:

    void swap(test_wrapper& lhs, test_wrapper& rhs)
    {
        lhs.swap(rhs);
    }
    

Anmelden zum Antworten