Создает ли копия данных std :: vector в C ++? - PullRequest
4 голосов
/ 09 июля 2010

Мне интересно, если создание нового std::vector (или вызов его assign метода) создает копию данных?

Например,

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?
}

Ответы [ 5 ]

11 голосов
/ 09 июля 2010

Да.Элементы всегда копируются в или из контейнеров STL.(По крайней мере до тех пор, пока семантика перемещения не будет добавлена ​​в C ++ 0x)

РЕДАКТИРОВАТЬ: Вот как вы можете проверить себя на копирование:

#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());
}

Вывод должен быть:

Эй, смотри!Новая копия проверки!
Я копия проверки!Нет, я!Подождите, мы оба одинаковы!
Erroap = 02-0304-231 ~ Нет носителя
Erroap = 02-0304-231 ~ Нет носителя

9 голосов
/ 09 июля 2010

Элементы всегда копируются в или из контейнеров STL.

Хотя элемент может быть просто указателем, в этом случае указатель копируется, но не базовые данные

1 голос
/ 09 июля 2010

О семантике перемещения, вот как вы можете перемещать содержимое в C ++ 0x, если хотите:

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));
}
0 голосов
/ 09 июля 2010

Если вам не нужна семантика копирования объекта, вы можете вместо этого создать вектор указателей на объекты, чтобы копировался только указатель. Однако затем вы должны убедиться, что указатели остаются действительными в течение всего срока службы контейнера.

0 голосов
/ 09 июля 2010

Если вы хотите, чтобы ваши данные были перемещены, используйте std::swap_ranges, но вы должны сначала выделить для памяти:

vector<T> v;
v.reserve(std::distance(beg, end));
std::swap_ranges(beg, end, v.begin());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...