stl: вопрос
хотя итератор может сломаться после push_back
так что лучше так не делать
если, например, память под вектор будет перевыделяться, то итератор будет указывать на "левую" область памяти
для вектора не гарантируется валидность итератора после вставкия тоже имею такое мнение, однако задокументировано ли это?
тут не увидел:
http://www.sgi.com/tech/stl/Vector.html
Просто сейчас ситуация такова, что после вставки у меня прога падает при попытке обращения к последнему элементу (а там нули) (это текущая диагностика, на самом деле ошибка может и в другом)
std::vector<int> v;
unsigned len = v.size;
for (unsigned i = 0; i < len; i++)
{
....//обращаемся к элементам вектора так: v[i]
if (...) v.push_back(100);
}
Операция "<=" для итератора не определена
std::vector <int> v;
std::vector::iterator i;
std::list<int> addedItems;
...
for (i = v.begin ; i<= v.end; ++i)
{
if (bla-bla) addedItems.push_back (100);
}|
//не помню как точно записывается
v.push_back_all(addedItems);
//не помню как точно записываетсячто за ахтунг?
v.push_back_all(addedItems);
я бы сделал так
v.insert(v.end addedItems.begin addedItems.end;
это оно и есть
Всем спасибо, буду пробовать
STL и скорость перебора элементов.
Пишу под КПК (WinCE) и перебор элементов этого вектора выполняется каждую перерисовку. После добавления в вектор еще одного отображаемого объекта тормозов прибавлялось так, что видно было заметно на глаз.
Решил проверить свои подозрения и забацал тестик.
Результаты: копец - обычный массив быстрее в 20
Я конечно, упростил ситуацию - в векторе у меня собраны указатели, а в массиве сами объекты (это попроще наверно).
Это действительно такая разница и от частого перебора вектора лучше отказаться?
#include <windows.h>
#include "auxLib.h"
#include <vector>
class CObject
{
public:
CObject;
int m_SizeX ;
int m_SizeY ;
float m_PositionX ;
float m_PositionY;
};
CObject::CObject
{
m_SizeX = 0;
m_SizeY = 0;
m_PositionX = 0;
m_PositionY = 0;
};
const int OBJECT_MAX = 50000;
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
int j;
DWORD StartTime, EndTime, Result1, Result2;
// Тест как вектор
CObject* pObj;
std::vector <CObject*> g_Objects;
for (j = 0; j<= OBJECT_MAX - 1; j ++)
{
pObj = new CObject ;
g_Objects.push_back (pObj);
}
std::vector <CObject*>::iterator i;
StartTime = GetTickCount ;
for (i = g_Objects.begin ; i != g_Objects.end ; ++i)
{
(*i)->m_SizeX = j + 1;
(*i)->m_SizeY = j + 2;
(*i)->m_PositionX = j + 3;
(*i)->m_PositionY = j + 4;
}
EndTime = GetTickCount ;
Result1 = EndTime - StartTime;
// Тест массивом
CObject *pArr= new CObject[OBJECT_MAX];
CObject *pIt;
pIt = pArr;
StartTime = GetTickCount ;
for (j = 0; j<= OBJECT_MAX - 1; j++)
{
pIt->m_SizeX = j + 1;
pIt->m_SizeY = j + 2;
pIt->m_PositionX = j + 3;
pIt->m_PositionY = j + 4;
pIt++;
}
EndTime = GetTickCount ;
Result2 = EndTime - StartTime;
Log(L"\nRes1: %i, Res2: %i\n", Result1, Result2);
}
Результаты: копец - обычный массив быстрее в 20Собери проект в релизе.
И с вектором в твоём случае лучше работать не через итераторы. Есть такая штука T* pT = &v[0] - как указатель на массив.
а говорят, что это на перле код нечитаемый
Убрал итератор и разница исчезла - крута
(если я конечно не перемудрил).Это нормально так делать? (про запихивание объектов в вектор, они ведь раскопируются и это будет ни один объект?)
CObject Obj;
std::vector <CObject> Objects;
for (j = 0; j<= OBJECT_MAX - 1; j ++)
Objects.push_back (Obj);
CObject *pi;
pi = &g_Objects[0];
for (j = 0; j <= OBJECT_MAX; j++)
{
...
}
EndTime = GetTickCount ;
то нормально так делать? (про запихивание объектов в вектор, они ведь раскопируются и это будет ни один объект?)Да, в вектор попадут копии. Если скорость добавления не критична, можно оставить как есть. Если критична - самое быстрое решение будет через пулы памяти и вызов оператора new над готовой памятью.
Спасиб, а то я уж напугался, что с указателями придется работать, а так - всего то надо от итераторов отказаться
Спасиб, а то я уж напугался, что с указателями придется работатьа че страшного ? Оо
Ниче, когда с ними постоянно работаешь.
Операция "<=" для итератора не определенакакое отчаянное гонево
вот гонево:
Есть такая штука T* pT = &v[0] - как указатель на массив
которе является хаком и не гарантируется, что будет работать в каком-либо стл
Это такое же отчаянное гонево, ботай 23.2.4.1
Ботать 23.2.4.1, 24.1.5 до просветления
только не очень понял о каком стандарте идет речь
напиши плз
Programming-Languages-C++-International-Standart-ISO-IEC-148821998-09-01-Ansi-Standart
ANSI-ISO-IEC-14882 2003
Programming languages — C++
как это ни странно
а вот в 23.2.4.1 ничего полезного не нашел.
можно цитату, в которой рассказывается про &v[0] ?
не могу скачать 2003 =( есть только 1998
A vector is a kind of sequence that supports random access iterators. In addition, it supports (amortized)
constant time insert and erase operations at the end; insert and erase in the middle take linear time. Storage
management is handled automatically, though hints can be given to improve efficiency. The elements of a
vector are stored contiguously, meaning that if v is a vector<T, Allocator> where T is some type
other than bool, then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size.
теперь буду в курсе =)
ни в гз локалке, ни на торрентсру =\
кое-как скачал в емуле =\
а чё, нормальной бесплатной документации по плюсам не бывает?
держи -
Оставить комментарий
0000
Примерный код (точно есть косяки - пишу по памяти)Вопрос: будет ли элемент 100 в цикле обработан и что вообще с итератором произойдет?