Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2019, 14:49   #1
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию Копирование вектора (std::vector)

Есть некоторая структура Measure_Simulation, которая включает в себя достаточно много полей типа int, long, long double, char*, bool.
И есть вектор (std::vector) measuresvector, каждый элемент которого относится к типу Measure_Simulation. Этот вектор имеет 40 тысяч таких элементов.
Я копирую содержимое вектора measuresvector в другой вектор measuresvector2, используя следующий код:

Код:
std::back_insert_iterator<std::vector <Measure_Simulation> >  toV(measuresvector2);
std::copy(measuresvector.begin(),measuresvector.end(),toV);
Этот процесс копирования занимает 20 секунд.

Можно ли как-то сделать это копирование быстрее? Какой код для этого следует использовать?
erslgoeirjh вне форума Ответить с цитированием
Старый 28.10.2019, 14:53   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Просто присваивайте или используйте конструктор копирования.
p51x вне форума Ответить с цитированием
Старый 28.10.2019, 17:05   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Но весьма вероятно, что скорости от этого не прибавится.
При таких объемах лучше подумать а надо ли делать копию.
waleri вне форума Ответить с цитированием
Старый 28.10.2019, 17:08   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Прибавится, пуш_бекать каждый элемент так себе идея. А конструктор копирования может как минимум сразу память выделить.
p51x вне форума Ответить с цитированием
Старый 28.10.2019, 17:50   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Согласен, но все равно, 20 сек на 40К выделений что-то как-то медленно.
Оно наверно и отладочная сборка, но все же...
waleri вне форума Ответить с цитированием
Старый 30.10.2019, 16:16   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от erslgoeirjh Посмотреть сообщение
Можно ли как-то сделать это копирование быстрее? Какой код для этого следует использовать?

пример:
Код:
#include <iostream>
#include <vector>

struct sample
{
    sample(int v) { std::cout << "sample(" << v << ");\n"; }
    sample(sample&& v) noexcept { std::cout << "sample(move);\n"; }
    sample(const sample& v) noexcept { std::cout << "sample(copy);\n"; }
    
    sample& operator=(sample&& v) noexcept { std::cout << "operator=(move);\n"; }
    sample& operator=(const sample& v) noexcept { std::cout << "operator=(copy);\n"; }
    
};

int main()
{
    // --- создание
    std::vector<sample> v1(1000, 10);
    const auto v2 = v1;
    
    // --- копирование
    std::vector<sample> v0;
    v0.reserve(v1.size());
    v0 = v1;
}
что здесь важно?
1.
конструкторы и operator= по возможности noexcept
тогда вектор сможет задействовать оптимальный мув для элементов,
в случае реалока.

2.
при копировании в уже существующий вектор,
не нужно писать вот такое порно:
Код:
std::back_insert_iterator<std::vector <Measure_Simulation> >  toV(measuresvector2);
std::copy(measuresvector.begin(),measuresvector.end(),toV);
а нужно, что бы для структуры был определен operator=
и самое главное: нужно заранее застолбить память,
с помощью reserve
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Java. Vector<Vector<String>>, вывод в текстовый файл. Artsiom Помощь студентам 0 05.12.2016 16:00
Копирование интервала std::vector sVasilich Общие вопросы C/C++ 10 20.06.2013 15:29
Даны два вектора b=(b1,b2,...,b6),x=(x1,x2,...,x6) и матрица А(6х6).написать программу вычисления длины вектора Ax-b. infern_o Паскаль, Turbo Pascal, PascalABC.NET 10 21.03.2013 10:50
C++ Boost - vector<path> to vector<string> frommars Общие вопросы C/C++ 0 04.02.2013 21:19
дано 3 вектора. определить максимальный чётный элемент каждого вектора и упорядочить по убыванию 3Doleg Паскаль, Turbo Pascal, PascalABC.NET 0 04.12.2012 01:45