随笔3- list array

时间:2023-03-09 19:22:10
随笔3- list array

今天看到了一段代码 使用 数组去初始化赋值给list,就是把指针的首地址和end地址的下一位传递给list,把内存中这段长度copy到list中,

回忆起以前看到的一个资料

摘自C++ Primer

尽管不能直接将一种容器内的元素复制给另一种容器,但系统允许通过传递 一对迭代器间接实现该实现该功能。

使用迭代器时,不要求容器 类型相同。容器内的元素类型也可以不相同,只要它们相互兼容,能够将要复制 的元素转换为所构建的新容器的元素类型,即可实现复制。

迭代器标记了要复制的元素范围,这些元素用于初始化新容器的元素。

迭代 器标记出要复制的第一个元素和最后一个元素。

采用这种初始化形式可复制不能 直接复制的容器。更重要的是,可以实现复制其他容器的一个子序列:

// initialize slist with copy of each element of svec

list<string> slist(svec.begin(), svec.end());

// find midpoint in the vector

vector<string>::iterator mid = svec.begin() + svec.size()/2;

// initialize front with first half of svec: The elements up to but not including *mid

deque<string> front(svec.begin(), mid);

// initialize back with second half of svec: The elements *mid through end of svec

deque<string> back(mid, svec.end());

回顾一下指针,我们知道指针就是迭代器,因此允许通过使用内置数组中的 一对指针初始化容器也就不奇怪了

char *words[] = {"stately", "plump", "buck", "mulligan"};

// calculate how many elements in words

size_t words_size = sizeof(words)/sizeof(char *);

// use entire array to initialize words2

list<string> words2(words, words + words_size);

这里,使用 sizeof计算数组的长度。将数组长度加到指向第一 个元素的指针上就可以得到指向超出数组末端的下一位置的指针。通过指向第一个元素的指针 words 和指向数组中最后一个元素的下一位置的指针,实现了 words2 的初始化。其中第二个指针提供停止复制的条件,其所指向的位置上存放的元素并没有复制