come inserire molti valori in array in modo efficiente (con C + + 17 o precedenti)?

dato un array con una dimensione con voci m che hanno la dimensione di 3: n = m * 3. su ogni posizione dopo m valori un nuovo valore deve essere inserito che la dimensione è in seguito n = m * 4. enter image description here

il mio approccio ingenuo sarebbe quello di creare un array più grande con la nuova dimensione e poi iterare sopra gli array copiare i valori nel nuovo e ogni m passi per aggiungere un altro passo per la nuova array-iterazione e il riempimento del nuovo valore.

credo che questo potrebbe non essere efficiente. purtroppo questo allineamento interleaving è effettuato spesso. pertanto, il codice dovrebbe essere efficiente per evitare lunghi tempi di elaborazione.

quali sono alcuni altri stategie e ci sono strumenti nella libreria standard attuale da utilizzare?

EN From: How to insert many values in arrays efficiently (with C++17 or earlier)?

More similar articles:

5 Comments

  1. se sai che sarà frequente, allora forse un array non è il contenitore giusto per cominciare? forse una lista collegata sarebbe una scelta migliore?

  2. inserisci i nuovi elementi come un unico passo? così ogni “42; 3” cresce a “42; 4” contemporaneamente? o in passi di m, ma ordinato (primo elemento cresce primo, ultimo m)? e l’accesso agli elementi esistenti? vuoi accedere ad un singolo elemento alla volta? o un singolo “passo” (“42; 3”, “42; 4”)? numero arbitrario di elementi? quanto spesso?

  3. non importa se l’array cresce in una o più fasi. gli elementi dell’array non vengono modificati durante il ridimensionamento. essi potrebbero essere accessibili solo per lo scopo di ridimensionamento. quanti elementi sono trattati alla volta è arbitrario. il numero di eseguire il ridimensionamento è probabilmente in migliaia (non ho un singolo numero). dopo il ridimensionamento gli elementi sono trattati a passi di 4.

  4. i tuoi elementi devono essere sequenziali? se non si può avere un vettore di vettori e fare l’interleaving quando si accede ai vettori.

    personalmente, vorrei utilizzare una classe contenitore personalizzato che avvolge un vector< vector<foo>>:

    template <class T>
    class interleaved_vector 
    {
        std::vector< std::vector <T> > data;
    
      public:
        void interleave(const std::vector <T> & v)
        {
           data.push_back(v);
        }
    
        /* I am a little bit rusty on move-semantics, so I don't guarantee this is 
           correct */
        void interleave(std::vector &&v)
        {
           data.push_back(std::move(v));
        }
    
        // Access the data in an interleaved way
        // This assumes all the interleaved vectors have the same size.
        T operator[] (size_t i) const
        {
           size_t i1 = i / data.front().size();
           size_t i2 = i % data.front().size();
    
           return data[i1][i2];
        }
    
        T & operator[] (size_t i)
        {
           size_t i1 = i / data.front().size();
           size_t i2 = i % data.front().size();
    
           return data[i1][i2];
        }
    
     }

    ora, è possibile dichiarare un contenitore di interleaved int s:

    interleaved_vector<int> iv;
    
    // populate the vector 
    
    std::vector<int> v(m)
    
    iv.interleave(v);
    iv.interleave(v);
    iv.interleave(v);
    
    // populate it using move-semantic
    iv.interleave(std::move(v));
    
    // read the n-th element after interleaving
    int i = iv[n];
    
    // set the n-th element after interleaving 
    iv[n] = 1234;

    questa non è una classe di contenitori completa, ma solo un’idea generica. manca Iterators ecc…. Come completarlo, e meglio adattarlo al vostro caso d’uso, è lasciato come un esercizio per il lettore

  5. questo problema non è formulato particolarmente chiaramente. si inizia guardando come avete std::array< /* 3-byte type */, m> (un array con m voci, ciascuno di dimensione 3), ma allora che cosa è questo “ogni posizione dopo m“? inserendo un nuovo valore (3-byte) i valori aumentano a 4 byte ciascuno? e che cos’è questo script?

    forse potresti integrare la tua domanda con alcune dichiarazioni per illustrare cosa stiamo trattando? potrebbe anche essere utile entrare nel motivo per cui un array è stato scelto invece di un altro contenitore.

Leave a Reply

Your email address will not be published. Required fields are marked *