У меня вопрос.
Если я запоминаю итератор, указывающий на какой-то элемен в векторе, а потом этот лемент удаляю, то итератор должен стать некорректным. Это верно?
Ес да, то как тогда можно вытащить из вектора все элементы, удовлетворяющие необходимому условию, и вставить их в другой вектор, содержание которого соответвтвует условию?
Код примерно следующий:
typedef std::vector<PROCESSSTRUCT> QSystemQueue[32];
bool CSystemQueue::Recalculate()
{
...
//Теперь размещаем процессы по очередям в зависимости от их приоритетаfor (uint i = 1; i <= 15; ++i)
{
if(!m_SystemQueue[i].empty() )
{
std::vector<PROCESSSTRUCT>::iterator cur;
std::vector<PROCESSSTRUCT>::iterator last = m_SystemQueue[i].end();
for (cur = m_SystemQueue[i].begin(); cur != last; ++cur)
{
uint prior = cur->ProcInfo.Priority.p_nice - cur->ProcInfo.Priority.p_cpu;
//Здесь необходимо написать код для перемещения структуры из одной очереди в другую
//Хотелось бы что-то наподобии такого:
//----------------------------------------if (proir != i)
{
m_SystemQueue[prior].push_back(cur);
m_SystemQueue[i].erase(cur);
};
//----------------------------------------
};
};
};
}
Я плохо еще общаюсь с STL, вот никак не могу понять, как лучше это сделать.
Здравствуйте, Balsamo, Вы писали:
B>У меня вопрос. B>Если я запоминаю итератор, указывающий на какой-то элемен в векторе, а потом этот лемент удаляю, то итератор должен стать некорректным. Это верно? B>Ес да, то как тогда можно вытащить из вектора все элементы, удовлетворяющие необходимому условию, и вставить их в другой вектор, содержание которого соответвтвует условию?
Это можно сделать в три приёма. Сначала копируешь элементы из одного вектора в другой с помощью remove_copy_if, потом удаляешь в первом векторе элементы соответствующие твоему условию с помощью remove_if и наконец заканчиваешь удаление методом vector::erase. Вот пример:
#include <algorithm>
#include <functional>
#include <iostream>
#include <vector>
using std::vector;
using std::unary_function;
using std::not1;
using std::cout;
using std::ostream_iterator;
using std::endl;
struct pred : unary_function<int, bool>
{
result_type operator()(argument_type x) const
{
return x < 6;
}
};
int main()
{
int a[] = {1,2,3,4,5,6,7,8,9,10};
vector<int> v(a, a + sizeof(a)/sizeof(a[0]));
vector<int> v2;
remove_copy_if(v.begin(), v.end(), back_inserter(v2), not1(pred()));
vector<int>::iterator last = remove_if(v.begin(), v.end(), pred());
v.erase(v.begin(), last);
copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
cout << endl;
copy(v2.begin(), v2.end(), ostream_iterator<int>(cout, " "));
cout << endl;
}
A>Это можно сделать в три приёма. Сначала копируешь элементы из одного вектора в другой с помощью remove_copy_if, потом удаляешь в первом векторе элементы соответствующие твоему условию с помощью remove_if и наконец заканчиваешь удаление методом vector::erase. Вот пример:
можно проще, разделить исходный вектор с помощью std::stable_partition (или std::partition если порядок не важен) нужную часть скопировать во второй вектор, и удалить в исходном:
A>Это можно сделать в три приёма. Сначала копируешь элементы из одного вектора в другой с помощью remove_copy_if, потом удаляешь в первом векторе элементы соответствующие твоему условию с помощью remove_if и наконец заканчиваешь удаление методом vector::erase. Вот пример:
можно проще, разделить исходный вектор с помощью std::stable_partition (или std::partition если порядок не важен) нужную часть скопировать во второй вектор, и удалить в исходном:
#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
#include <vector>
using std::vector;
using std::unary_function;
using std::cout;
using std::ostream_iterator;
using std::endl;
struct pred : unary_function<int, bool>
{
result_type operator()(argument_type x) const
{
return x < 6;
}
};
int main()
{
int a[] = {1,2,3,4,5,6,7,8,9,10};
vector<int> v(a, a + sizeof(a)/sizeof(a[0]));
vector<int>::iterator last = stable_partition(v.begin(), v.end(), pred());
vector<int> v2(v.begin(), last);
v.erase(v.begin(), last);
copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
cout << endl;
copy(v2.begin(), v2.end(), ostream_iterator<int>(cout, " "));
cout << endl;
}