有时需要判断指针是否指同一块内存,例如设计字符串时:
(1)insert函数
(2) replace函数
(3)assign函数
难点是迭代器,判断是否同一个迭代器时,需要你在设计迭代器时加入一些功能。
还有昨天介绍的MoveBack函数:
/// <summary>
/// 不改变原有数据,把内存段区间 [begin,pend) 向后移动nCount位,后面的
/// 数据会pend后面会覆盖nCount-1个,包括pend就是nCount个,如果bFilling
/// 为True,则用相应的pFilling所指的数据填充空出来的内存。
/// 例:
/// _string s = "sss123 www";
/// MoveBack(s.begin(), s.begin() + 6, 3, true, s.end() - 3);
/// 结果:s=wwwsss123www
///
/// 注意:pFilling 与 pbegin,pend,不能在同一区域的内存块中。
///
/// </summary>
/// <typeparam name="T">数据类型</typeparam>
/// <param name="pbegin">开始位置</param>
/// <param name="pend">结束位置</param>
/// <param name="nCount">移运个数</param>
/// <param name="bFilling">是否填充</param>
/// <param name="pFilling">指向填充数据的指针</param>
/// <returns></returns>
/// 创建时间:2024-10-03 最后一次修改时间:2024-10-03 (已测试)
template<class T>
T* MoveBack(T* pbegin, T* pend, const size_t& nCount,const bool& bFilling = false, const T* pFilling = null){assert(pend >= pbegin);for (size_t n = 0; n < pend - pbegin; ++n) {*(pend + nCount - 1 - n) = *(pend - 1 - n);}if (bFilling && pFilling) { //检查bFilling不能在区间[pbegin,pend + nCount)中assert(pFilling < pbegin || pFilling >= pend + nCount);for (size_t n = 0; n < nCount; ++n) {*(pbegin + n) = *(pFilling + n);}}return pbegin;
}
其实很简单,看例子:
/// <summary>
/// 判断pt是否指向区块内存[pbegin,pend)。
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="pbegin"></param>
/// <param name="pend"></param>
/// <param name="pt"></param>
/// <returns></returns>
/// 创建时间:2024-10-04 最后一次修改时间:2024-10-04
template<class T>
bool isPointsToTheSameMemoryArea(const T* pbegin, const T* pend, const T* pt)
{return pt >= pbegin && pt < pend;
}int main() {_string s = "567891234";const wchar_t* p1 = s.c_str() + 5;const wchar_t* p2 = _t("1234");_cout << _t("p1=") << p1 << _t("\n");_cout << _t("p2=") << p2 << _t("\n");if (isPointsToTheSameMemoryArea(s.begin(), s.end(), p1)) {_cout << _t("p1与字符串s指向同一块内存区域!\n");}else{_cout << _t("p1与字符串s指向不同内存区域!\n");}if (isPointsToTheSameMemoryArea(s.begin(), s.end(), p2)) {_cout << _t("p2与字符串s指向同一块内存区域!\n");}else{_cout << _t("p2与字符串s指向不同内存区域!\n");}}
输出结果: