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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.06.2013, 14:34   #1
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию Копирование интервала std::vector

Нужно скопировать часть элементов из одного вектора в другой. Например, все элементы со значением 2. Подскажите, что делаю неправильно:

Код:
    //создать и заполнить вектор
    std::vector<int> vector1;
    for (int i=0; i<4; ++i)
        for (int j=0; j<10; ++j)
            vector1.push_back(i);
   
    //в данном случае не обязательно, но всё же
    std::sort(vector1.begin(), vector1.end());

    //найти все двойки
    std::pair<std::vector<int>::iterator, std::vector<int>::iterator> bounds;
    bounds = std::equal_range(vector1.begin(), vector1.end(), 2);

    //копировать будем сюда
    int distance = bounds.second - bounds.first;
    std::vector<int> vector2;
    vector2.reserve(distance);

    //собственно копирование
    std::copy(bounds.first, bounds.second, vector2.begin());
На выходе получилось в vector1 40 элементов (всё правильно), distance = 10 (тоже правильно) и 0 элементов в vector2.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 13.06.2013, 14:42   #2
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Получилось скопировать вот так:
Код:
vector2.insert(vector2.begin(), bounds.first, bounds.second);
Но всё равно интересно, почему не сработало с std::copy
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 13.06.2013, 22:15   #3
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

А почему не воспользоваться предикатом:
bool IsTwo(int val)
{
return val == 2;
}
а затем ичпользовать copy_if-алгоритм?
Igor95 вне форума Ответить с цитированием
Старый 13.06.2013, 23:38   #4
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,120
По умолчанию

sVasilich

Нужно скопировать часть элементов из одного вектора в другой. Например, все элементы со значением 2. Подскажите, что делаю неправильно:

чё-та у тебя как-то сложно...

std::vector<int> vector1;
...
std::vector<int> vector2(std::count(vector1.begin(), vector1.end(), 2), 2);
Rififi вне форума Ответить с цитированием
Старый 14.06.2013, 10:13   #5
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Rififi
Код:
std::vector<int> vector2(std::count(vector1.begin(), vector1.end(), 2), 2);
Интересный вариант, но мне не подходит. Здесь тип вектора int взят для простоты. В реальной программе используется класс и выборка делается только по одному из его членов. Все остальные члены класса могут иметь различные значения. Поэтому нужно именно скопировать.

Igor95
Почему-то компилятор выдал ошибку

Цитата:
ошибка: 'copy_if' is not a member of 'std'
Хотя подсказку по синтаксису успешно показал... Компилятор GCC, IDE- QTCreator. Дома под майкросовтовским попробую.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 14.06.2013, 10:34   #6
Ezhik Kihze
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 639
По умолчанию

Цитата:
Почему-то компилятор выдал ошибку
algorithm подключен?
ICQ: 677936656 Gmail: ekEmbed@gmail.com
Ezhik Kihze вне форума Ответить с цитированием
Старый 14.06.2013, 10:48   #7
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Ezhik Kihze, ну да.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 14.06.2013, 11:17   #8
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,120
По умолчанию

sVasilich

ошибка: 'copy_if' is not a member of 'std'

функция copy_if изначально появилась в стандарте c++0x (теперь c++11)
для gcc попробуй ключ -std=... или возьми более новую версию

В реальной программе используется класс и выборка делается только по одному из его членов.

struct Foo
{
int a, b;
};

// код для c++11
std::vector<Foo> v1, v2;
std::copy_if(v1.begin(), v1.begin(), std::back_inserter(v2), [](const Foo& f) { return f.a == 2; });

для обычного c++ можно заюзать remove_copy_if и предикат
(хотя особого смысла не имеет, пора уже переходить на c++11)

Код:
struct MatchA : public std::unary_function<Foo, bool>
{
	MatchA(int a) : a_(a) {};
	int a_;
	bool operator()(const Foo& f) const
	{ return f.a == a_; }
};

std::remove_copy_if(v1.begin(), v1.begin(), std::back_inserter(v2), std::not1(MatchA(2)));
Rififi вне форума Ответить с цитированием
Старый 14.06.2013, 14:23   #9
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Rififi, спасибо за пояснение!


И всё таки, что с std::copy в первом моём сообщении не так? Интересно именно в этом варианте ошибку понять.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 20.06.2013, 11:05   #10
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,152
По умолчанию

vector2.reserve(distance) не эквивалентно vector2.resize(distance, 0 /*какойто def_val*/).
Откуда и copy не срабатывает, раз элемента с таким индексом не объявлено (хотя память и зарезервирована для использования).

Последний раз редактировалось Smogg; 20.06.2013 в 11:09.
Smogg вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ Boost - vector<path> to vector<string> frommars Общие вопросы C/C++ 0 04.02.2013 21:19
std::vector и его инициализация coNsept Общие вопросы C/C++ 5 15.06.2012 13:40
Вопрос по std::vector Сtrl Общие вопросы C/C++ 8 21.10.2011 02:16
ошибка: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = std::char_traits<char> Critter Общие вопросы C/C++ 5 08.08.2010 23:38
std::vector ciaonataha Общие вопросы C/C++ 1 10.05.2009 15:50