Я не программирую iphone для информации, поэтому я представляю себе std :: vector, это довольно просто, просто и достаточно элегантно:
#include <iostream>
using std::cout;
#include <vector>
using std::vector;
#include <cassert> //no need for using, assert is macro
template<typename T>
void eraseCircularVector(vector<T> & vec, size_t position, size_t count)
{
assert(count <= vec.size());
if (count > 0)
{
position %= vec.size(); //normalize position
size_t positionEnd = (position + count) % vec.size();
if (positionEnd < position)
{
vec.erase(vec.begin() + position, vec.end());
vec.erase(vec.begin(), vec.begin() + positionEnd);
}
else
vec.erase(vec.begin() + position, vec.begin() + positionEnd);
}
}
int main()
{
vector<int> values;
for (int i = 0; i < 10; ++i)
values.push_back(i);
cout << "Values: ";
for (vector<int>::const_iterator cit = values.begin(); cit != values.end(); cit++)
cout << *cit << ' ';
cout << '\n';
eraseCircularVector(values, 5, 1); //remains 9: 0,1,2,3,4,6,7,8,9
eraseCircularVector(values, 16, 5); //remains 4: 3,4,6,7
cout << "Values: ";
for (vector<int>::const_iterator cit = values.begin(); cit != values.end(); cit++)
cout << *cit << ' ';
cout << '\n';
return 0;
}
Тем не менее, вы можете рассмотреть:
- создание нового класса loop_vector, если вы используете этот вид функциональности достаточно
- используя список, если вы выполняете много удалений (или несколько удалений (не с конца, это просто pop_back), но большой массив)
Если ваш контейнер (NSMutableArray или любой другой) не является списком, а вектором (то есть массивом с изменяемым размером), вам определенно не нужно удалять элементы один за другим, а весь диапазон (например, std :: vector erase (begin, конец)!
Редактировать : реагировать на комментарии, чтобы полностью понять, что должно быть сделано вектором, если вы удалите элемент, отличный от последнего: он должен скопировать все значения после этого элемента (например, 1000 элементов в массиве, сначала вы стираете 999x копирование (перемещение) предмета, что очень дорого).
Пример:
#include <iostream>
#include <vector>
#include <ctime>
using namespace std;
int main()
{
clock_t start, end;
vector<int> vec;
const int items = 64 * 1024;
cout << "using " << items << " items in vector\n";
for (size_t i = 0; i < items; ++i) vec.push_back(i);
start = clock();
while (!vec.empty()) vec.erase(vec.begin());
end = clock();
cout << "Inefficient method took: "
<< (end - start) * 1.0 / CLOCKS_PER_SEC << " ms\n";
for (size_t i = 0; i < items; ++i) vec.push_back(i);
start = clock();
vec.erase(vec.begin(), vec.end());
end = clock();
cout << "Efficient method took: "
<< (end - start) * 1.0 / CLOCKS_PER_SEC << " ms\n";
return 0;
}
Производит продукцию:
using 65536 items in vector
Inefficient method took: 1.705 ms
Efficient method took: 0 ms
Обратите внимание, что очень легко стать неэффективным, посмотрите, например, иметь на http://www.cplusplus.com/reference/stl/vector/erase/