在C++中遍历列表的一部分
Iterate through part of a list in C++
我是C++的新手,我正在研究合并排序的实现,以帮助自己熟悉该语言。
目前,我有一个整数列表,我想创建2个子列表,并将原始列表的前半部分存储在名为"left"的列表中,其余一半存储在一个名为"right"的列表中
例如:假设我的原始列表数据是16、24、56、12、89;我想在这个列表中反复添加16,24添加到新的子列表"left"在"right"子列表中添加56、12、89因此向左将导致[16,24]右边是[56,1289]
这是我现在拥有的代码;我应该在if语句中写什么条件?('l'是函数参数中传递的列表的名称)
list<int> left, right;
int midpt = l.size()/2;
for(listIt = l.begin(); listIt!= l.end(); listIt++){
if () left.push_back(*listIt);
if () right.push_back(*listIt);
}
这可能更容易:
#include <iterator>
#include <list>
auto middle = std::next(l.begin(), l.size() / 2);
std::list<int> left(l.begin(), middle), right(middle, l.end());
这直接从相应的范围构建了两个新的列表left
和right
。std::next
算法返回一个迭代器,该迭代器是通过将给定的迭代器前进给定的步数来获得的。注意,std::list<int>::size()
在C++11中具有恒定的运行时复杂性,尽管迭代迭代器需要线性工作量。
这会起作用。
list<int> left, right;
int midpt = l.size()/2;
int count = 0;
for(listIt = l.begin(); listIt!= l.end(); listIt++){
if (count++ < midpt)
left.push_back(*listIt);
else
right.push_back(*listIt);
}
使用std::list::insert
而不是for循环。尝试-
left.insert(l.begin(), l.begin() + midpt);
right.insert(l.begin() + midpt, l.end());
鉴于std::list
定义了一个双链表,可能值得考虑一种稍微不同的方法。您可以考虑将第一个元素添加到left
列表中,将最后一个元素添加在right
列表中,推进两个迭代器,然后重复(直到迭代器相遇),而不是找到列表的中间部分,将其左边的部分添加到一个列表中,右边的部分添加另一个列表。
大多数其他方法都需要对列表进行线性遍历以找到中间,然后对两侧进行线性遍历来构建两个新列表。换句话说,您遍历列表1.5次。
通过同时从前面和后面遍历,只需遍历列表一次就可以完成整个工作。就big-O复杂性而言,它们是等效的(在两种情况下都是O(N)),但在更实际的情况下,我们可以预期遍历列表一次的速度大约是遍历列表1.5次的一半(尽管根据列表大小,缓存可能会在一定程度上影响这一点)。
- Pybind11:将元组列表从Python传递到C++
- 从链接列表c++中删除一个项目
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- C++如何通过用户输入删除列表元素
- 读取文件的最后一行并输入到链接列表时出错
- 复制列表初始化的隐式转换的等级是多少
- LNK2038、MSVS2017 MAGMA的原因列表
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 没有为自己的结构调用列表推回方法
- 使用简单类型列表实现的指数编译时间.为什么
- 一对向量构造函数:初始值设定项列表与显式构造
- C++:如何使函数只返回作为列表一部分的字符串
- 如何在C++中创建 2d 数组,其中一部分包含循环计数器,另一部分包含数字列表?
- 按文件中列表中行的一部分排序
- 标准的哪一部分决定了现场成员与初始化器列表的优先级
- C++:getline不是参数列表的一部分
- 在C++中遍历列表的一部分
- 是被视为列表一部分的单链列表的根节点
- 在c++中传递数组并检查列表是否为数组的一部分
- visualstudio2010-有没有一个列表,说明哪些编译器支持C++标准的哪一部分