想建网站怎么做,天津建设招聘信息网站,外国ps素材网站,个人不良信息举报网站线性表#xff1a; 线性表是最基本、最简单、也是最常用的一种数据结构。线性表#xff08;linear list#xff09;是数据结构的
一种#xff0c;一个线性表是n个具有相同特性的数据元素的有限序列。 线性表中数据元素之间的关系是一对一的关系#xff0c;即除了第一个和…线性表 线性表是最基本、最简单、也是最常用的一种数据结构。线性表linear list是数据结构的
一种一个线性表是n个具有相同特性的数据元素的有限序列。 线性表中数据元素之间的关系是一对一的关系即除了第一个和最后一个数据元素之外其它数据元素都是首尾相接的注意这句话只适用大部分线性表而不是全部。比如循环链表逻辑层次上也是一种线性表存储层次上属于链式存储但是把最后一个数据元素的尾指针指向了首位结点。
线性表_百度百科 (baidu.com)
C中的数组vectorstring是线性表大家对线性表操作非常熟悉感觉非常方便比如
std::string s Hello World!;
在字符串 s 中的第二个字符是 * (s.c_str() 1), 或者 *(s.begin() 1), 是字符 e;
为什么还要设计迭代器是因为要数据与算法分离这是C标准库的核心如果
不理解这个你会感觉标准库非常难用明明很简单的事为什么搞得那么复杂。
看下面的例子
int main() { std::string s Hello World!;std::listchar slist1 { H,e,l,l,o, , W,o,r,l,d,!};std::listchar slist2(s.begin(), s.end());for (auto c : slist1) {std::cout c;}std::cout \n;for (auto c : slist2) {std::cout c;}std::cout \n;return 0;
}
输出结果都是 因此设计迭代器的核心目标数据与算法分离。 再看一个例关于内存操作的例子看下面的函数 针对线性表
/// 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);
/// 结果swwwsss123www
///
/// 注意pFilling 与 pbegin,pend不能在同一区域的内存块中。
///
/// /summary
/// typeparam nameT/typeparam
/// param namepbegin/param
/// param namepend/param
/// param namenCount/param
/// param namebFilling/param
/// returns/returns
/// 创建时间2024-10-03 最后一次修改时间2024-10-03 (已测试
templateclass 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;
}
int main() { std::string s Hello World!;//线性表_Arraychar arr;arr.SetBuffer(20,true); arr.Add(s.begin(), s.end());for (auto c : arr) {std::cout c;}std::cout \n;//在线性表中Hello World!######## 后移7位####Hello World!####//前面####用中国填空std::cout MoveBack(arr.Begin(), arr.End(), 7, true, 中国 : ) \n;}
运行结果 下面我们来设计可以针对迭代器进行移动的MoveBack_new函数 例子后面的???????是为容器预留下的内存空间。
templateclass IterClass, class ValueType IterClass::value_type
const IterClass MoveBackIter(const IterClass itbegin, const IterClass itend,const size_t nCount,const bool bFilling false,const ValueType* pFilling null){//assert(itend itbegin); //可能很多迭代器不支持for (size_t n 0; n itend - itbegin; n) {*(itend nCount - 1 - n) *(itend - 1 - n);}if (bFilling pFilling) { //检查bFilling不能在区间[pbegin,pend nCount)中//可能很多迭代器不支持//assert(pFilling itbegin || pFilling itend nCount);for (size_t n 0; n nCount; n) {*(itbegin n) *(pFilling n);}}return itbegin;
}
执行程序
int main() { std::string s Hello World!???????;//线性表_Arraychar arr;arr.SetBuffer(30,true); arr.Add(s.begin(), s.end());for (auto c : arr) {std::cout c;}std::cout \n;//在线性表中Hello World!######## 后移7位####Hello World!####//前面####用中国填空MoveBack_new(arr.begin(), arr.end(), 7, true, 中国 : );cout 线性表移动后内容;for (auto c : arr) { std::cout c; }std::cout \n;//链表_listchar li;li.Add(s.begin(), s.end());for (auto c : li) { std::cout c; }std::cout \n;MoveBack_new(li.begin(), li.begin() 12, 7, true, 中国 : );cout 链表移动后内容;for (auto c : li){ std::cout c; }
}
执行结果 结论 迭代器设计的目的就是把算法和数据剥离出来比如上面的MoveBack_new
即可以对线性表操作又可以对链表操作缺点是在这后面你要做太多的工作
和优化但是这对你熟悉和使用甚至设计标准库非常有用。