Domanda

Sono interessato se la creazione di un nuovo std::vector (o chiamando il suo metodo assign) crea una copia dei dati?

Ad esempio,

void fun(char *input) {
    std::vector<char> v(input, input+strlen(input));
    // is it safe to assume that the data input points to was COPIED into v?
}
.

È stato utile?

Soluzione

Sì.Gli elementi sono sempre copiati dentro o fuori dai contenitori STL.(Almeno fino a quando si sposta la semantica è aggiunta in c ++ 0x)

Modifica: Ecco come puoi testare per copiare te stesso:

#include <vector>
#include <iostream>

class CopyChecker
{
public:
    CopyChecker()
    {
        std::cout << "Hey, look! A new copy checker!" << std::endl;
    }
    CopyChecker(const CopyChecker& other)
    {
        std::cout << "I'm the copy checker! No, I am! Wait, the"
            " two of us are the same!" << std::endl;
    }
    ~CopyChecker()
    {
        std::cout << "Erroap=02-0304-231~No Carrier" << std::endl;
    }
};

int main()
{
    std::vector<CopyChecker> doICopy;
    doICopy.push_back(CopyChecker());
}
.

L'output dovrebbe essere:

.

Ehi, guarda!Un nuovo checker copia!
Sono il checker della copia!No io sono!Aspetta, i due di noi sono gli stessi!
Erroap= 02-0304-231 ~ Nessuna vettore Erroap= 02-0304-231 ~ Nessuna vettore

Altri suggerimenti

.

Gli elementi vengono sempre copiati o fuori dai contenitori STL.

Sebbene l'elemento possa essere solo un puntatore, nel qual caso il puntatore viene copiato ma non i dati sottostanti

Informazioni su The Move Semantics, ecco come puoi spostare il contenuto in C ++ 0x se volevi:

void fun_move(char *input)
{
    std::vector<char> v;
    auto len = strlen(input);
    v.reserve(len);
    std::move(input, input+len, std::back_inserter(v));
}
.

Se si desidera spostare i tuoi dati, utilizzare std::swap_ranges, ma devi prima assegnare la memoria:

vector<T> v;
v.reserve(std::distance(beg, end));
std::swap_ranges(beg, end, v.begin());
.

Se non si desidera che l'oggetto copia semantica, è possibile creare invece un vettore di puntatori-oggetti in modo da essere copiati solo il puntatore.Tuttavia, è necessario assicurarsi che i puntatori rimanga validi per la durata del contenitore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top