У меня есть std :: vector [1, 2, 3, 4, 5], и я хочу получить еще один вектор, содержащий все элементы, но второй один: [1, 3, 4, 5]. Один из способов сделать это (vec1 мой входной вектор):Самый быстрый способ создать копию std :: vector минус один элемент
std::vector<int> vec2;
vec2 = vec1;
vec2.erase(vec2.begin()+1)
Здесь я не очень нравится стирают, который O (п) сложность, поэтому, учитывая копию массива у меня будет 2n операций. Я думал, что старый манекен будет лучше:
std::vector<int> vec2;
for(int i=0; i<vec1.size(); ++i){
if (i != 1)
vec2.push_back(vec1[i]);
}
Это амортизированное время O (n). Асимптотическое поведение одинаково, но количество операций может быть меньше.
Я должен сделать это на довольно маленьких векторах (около 100 элементов), но у меня их миллиарды. Я заметлю существенную разницу?
Как вы это сделаете?
резерва вызовов первым. Что касается того, заметите ли вы разницу, хорошо ли это профиль, это единственный способ получить надежный ответ. – Borgleader
Возможно, вам стоит пересмотреть свой алгоритм, не копируйте, если вам это не нужно. Также проверьте insert() –
Вы можете перебирать вектор назад и стирать последний элемент, поэтому вам не нужно копировать.Или вы можете отслеживать индекс того, что должно быть первым элементом и переходить от него к концу. Существует много способов избежать копирования. –