std::sort 如何修改后备类型?

Posted

技术标签:

【中文标题】std::sort 如何修改后备类型?【英文标题】:How does std::sort modify the backing type? 【发布时间】:2016-02-16 10:22:27 【问题描述】:

当我使用begin()end() 迭代器在doubles 的vector 上调用sort 时,sort 函数如何修改原始vector 以包含排序值?

虽然迭代器只是代表一个值,但它们如何导致原始的 vector 被修改?

vector<double> nums = 10.33, 20.44, 60.77;
sort(nums.begin(), nums.end(); // how does the original nums get changed?

【问题讨论】:

它不代表一个值。它表示向量中的一个位置。 它可以通过取消引用迭代器来改变(交换)元素的值。 @NickyC 这是有道理的。但是它是如何修改向量的呢? 迭代器是指向某个范围内的某个对象并具有遍历元素的能力的任何对象。最明显的迭代器是指针。如果你知道指针是如何工作的,那么你就有答案了。 @songyuanyao 是的,我没想到。谢谢! 【参考方案1】:

迭代器不代表值,它代表容器、流或流缓冲区中的某个位置。本质上,它们是指针的泛化。一些迭代器允许您使用间接修改它们正在迭代的内容 (*it)。

在最简单的情况下,它可能只是一个指针。考虑这段代码:

vector<double> nums = 10.33, 20.44, 60.77;
double* it = &nums[0]; //get the address of the first element
++it; //increment the pointer
*it = 42; //assign 42 to nums[1]

迭代器提供几乎相同的功能(取决于迭代器的类型)。

vector<double> nums = 10.33, 20.44, 60.77;
vector<double>::iterator it = nums.begin();//get an iterator to the first element
++it; //increment the iterator
*it = 42; //assign 42 to nums[1]

【讨论】:

在这个例子中(以及大多数例子中),迭代器确实代表了容器中的一个位置。但它事实上代表了一个序列中的一个位置;容器是创建序列的一种方式,但它们不是唯一的方式。例如,std::istream_iterator 是一个迭代器,它指向一个字符序列,即使没有底层容器。 @PeteBecker 谢谢,已修复。 我不想分散注意力,因为它解决了所提出的问题,所以我不会更进一步,但它只是部分修复。关键抽象是 sequence,独立于 any 特定类型。想象一个类型my_iter 只保存一个整数,其operator* 返回std::rand(),其operator++() 递增整数,其operator==(my_iter) 比较两个my_iter 对象的整数值。这是一个有效输入迭代器的草图; for (my_iter it(0); it != my_iter(5); ++it) 遍历 5 个随机值的序列

以上是关于std::sort 如何修改后备类型?的主要内容,如果未能解决你的问题,请参考以下文章

使用 std::sort 对对象向量进行排序

带有模板的 std::sort 和 compare-function 不起作用

GraphQL.js - 在 resolveType 函数中使用接口作为默认(后备)类型

qsort 在 C++ 中不适用于哪些类型?

C++ STL中排序算法的工作

使用 std::sort 进行拓扑排序