64,686
社区成员
发帖
与我相关
我的任务
分享
for(vector<Student>::iterator iter = svec.begin(); iter != svec.end(); iter++)
{
iter = svec.erase(iter);
iter--;
}
int main(void)
{
{
vector<Student> svec;
Student stu01;
Student stu02("Bob", 6);
Student stu03("Chris", 5);
svec.push_back(stu01);
svec.push_back(stu02);
svec.push_back(stu03);
for(vector<Student>::iterator iter = svec.begin(); iter != svec.end(); iter++)
{
iter = svec.erase(iter);
//知道这个时候iter等于什么吗?等于svec.begin()!!虽然这个begin已经不是原来的那个begin了……
//begin-1是什么东西,真是天晓得咯,这种操作,出什么问题都有可能……
iter--;
}
}
return 0;
}
// !注意:T不能用对象,因为使用malloc/free操作内存
template <typename T>
class Vector : private UnCopy
{
public:
Vector() : m_buf(NULL), m_size(0), m_capacity(0) {}
Vector(WORD size) : m_buf(NULL), m_size(0), m_capacity(size)
{
if (size != 0) qpMalloc(m_buf, T, m_capacity);
}
~Vector() { Clear(); }
public:
bool Add(const T& value, bool minMemory = false)
{
if (m_capacity == 0 && m_buf == NULL)
{
qpMalloc(m_buf, T, 1);
if (m_buf == NULL) return false;
++m_capacity;
}
if (m_capacity == m_size || (minMemory && m_capacity - m_size != 1))
{
DWORD newSize = m_size + (minMemory ? 1 : (m_size < 5 ? (m_capacity + 1) : (1 + m_size / 10)));
if (newSize > USHRT_MAX) return false;
qpMallocEx(p, T, newSize);
if (p == NULL) return false;
m_capacity = static_cast<WORD>(newSize);
::memcpy(p, m_buf, m_size * sizeof(T));
qpFree(m_buf);
m_buf = p;
}
::memcpy(m_buf + m_size++, &value, sizeof(T));
return true;
}
bool Remove(const T& value, bool minMemory = false)
{
for (WORD pos = 0; pos < m_size; ++pos)
{
if (m_buf[pos] == value)
{
if (m_capacity == 1) { Clear(); return true; }
if (minMemory || m_capacity - m_size > 5)
{
qpMallocEx(p, T, m_size - 1);
if (p == NULL) return false;
--m_capacity;
::memcpy(p, m_buf, pos * sizeof(T));
::memcpy(p + pos, m_buf + pos + 1, (--m_size - pos) * sizeof(T));
qpFree(m_buf);
m_buf = p;
}
else
{
::memmove(m_buf + pos, m_buf + pos + 1, (--m_size - pos) * sizeof(T));
}
return true;
}
}
return false;
}
bool Resize(WORD size)
{
qpASSERT(size > 0);
if (size == m_capacity) return false;
qpMallocEx(p, T, size);
if (p == NULL) return false;
m_capacity = size;
::memcpy(p, m_buf, (size < m_size ? size : m_size) * sizeof(T));
qpFree(m_buf);
m_buf = p;
if (m_size > size) m_size = size;
return true;
}
T* Find(const T& value)
{
for (WORD pos = 0; pos < m_size; ++pos)
if (m_buf[pos] == value) return m_buf + pos;
return NULL;
}
bool Swap(WORD left, WORD right)
{
qpASSERT(left != right && left < m_size && right < m_size);
if (m_buf == NULL) return qpDbgError();
std::swap(m_buf[left], m_buf[right]);
return true;
}
bool Sort()
{
if (m_buf == NULL) return qpDbgError();
std::sort(m_buf, m_buf + m_size);
return true;
}
bool Exist(const T& value)
{
if (m_buf == NULL) return qpDbgError();
int low = 0;
int high = m_size;
while (low <= high)
{
int middle = (low + high) / 2;
if (value == m_buf[middle]) return true;
else if (value < m_buf[middle]) high = middle - 1;
else low = middle + 1;
}
return false;
}
short Distance(const T* value)
{
return static_cast<short>(value - m_buf);
}
T& operator [](WORD pos) { qpASSERT(m_buf); return m_buf[pos]; }
T& Get(WORD pos) { qpASSERT(m_buf); return m_buf[pos]; }
void Clear() { qpFree(m_buf); m_size = 0; m_capacity = 0; }
WORD Size() const { return m_size; }
WORD Capacity() const { return m_capacity; }
private:
T* m_buf;
WORD m_size;
WORD m_capacity;
};
int main(void)
{
{
vector<Student> svec;
Student stu01;
Student stu02("Bob", 6);
Student stu03("Chris", 5);
svec.push_back(stu01);
svec.push_back(stu02);
svec.push_back(stu03);
for(vector<Student>::iterator iter = svec.begin(); iter != svec.end(); )
{
iter = svec.erase(iter);//自动指向被删除元素的下一个
}
}
return 0;
}
for(vector<Student>::iterator iter = svec.begin(); iter != svec.end();)
{
iter = svec.erase(iter);
}
int main(void)
{
{
vector<Student> svec;
Student stu01;
Student stu02("Bob", 6);
Student stu03("Chris", 5);
svec.push_back(stu01);
svec.push_back(stu02);
svec.push_back(stu03);
for(vector<Student>::iterator iter = svec.begin(); iter != svec.end(); iter++)
{
iter = svec.erase(iter);
iter--;
}
}
return 0;
}
svec.erase(iter);
iter--;
iter=svec.erase(iter);
iter--