为什么C++sort()函数不以sort(vectorname)形式工作,而以sort形式工作(vectorname.b
Why does the C++ sort() function not work in the sort(vectorname) form whereas it works as sort(vectorname.begin(), vectorname.end())?
有人能解释为什么当矢量的名称放在括号内时,std::sort()
函数不起作用吗,例如sort(vectorname)
,而是发出编译器错误消息:
dictionary.cpp:20:12: error: no matching function for call to ‘sort(std::vector<std::__cxx11::basic_string<char> >&)’
sort(words);
而如果它是以CCD_ 3的形式写的,它工作正常吗?
以下是详细信息:
/* This is a dictionary program which is intended to
(1) read in separate words typed in the command line,
(2) sort them, and
(3) output them alphabetacally.
I am asking about lines #25 and #26.
*/
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
vector<string> words;
for(string word; cin>>word;) {
words.push_back(word);
}
cout<<"Number of words: "<<words.size()<<'n';
//sort(words.begin(), words.end()); //This method works ok
sort(words);//But this one doesn't work
for(int i=0; i<words.size(); ++i) {
if(i==0 || words[i-1]!=words[i]) {
cout<<words[i]<<'n';
}
}
}
这是在Ubuntu 15.10操作系统上,使用g++5.2.1编译器。
当您调用C++函数时,您会向它传递参数。std::sort
函数处理元素的"范围",在C++中,您可以通过一对"迭代器"指定范围,迭代器表示范围的开始和结束。因此,在今天的C++中,范围不是一个单一的对象,而是由两个对象描述的概念性事物。
这是一个非常灵活的设计,因为它允许std::sort
处理任何范围,这些范围可以由一对表示开始和结束的迭代器来描述(例如,您可以通过传递指向容器开始和中间的迭代程序来对容器的前半部分进行排序,也可以通过传递指针到数组开始和结束来对数组进行排序)。因此,要调用std::sort
,需要传递两个参数,它们必须是描述要排序的范围的迭代器
但这种灵活性是以方便为代价的:如果你有一个包含一系列元素的对象,比如vectorname
,它是一个单独的参数,而不是两个迭代器参数,所以你不能把它传递给std::sort
。相反,您可以调用begin()
和end()
成员函数来从中获得一对迭代器
然而,C++计划进行一些更改,以指定标准算法的新版本,包括sort
,它使用描述范围的单个对象。因此,将来您将能够将范围表示为描述该范围的一对迭代器,或者直接表示范围的单个对象。
简短的回答是:"因为std::sort
被定义为接收一对迭代器,而不是容器。"
有点尖刻的回答是:"因为您包含了<algorithm>
而不是"boost/range/algorithm/sort.hpp"
"。
一个更好(但仍然有点尖刻)的答案是"因为您包含了<algorithm>
而不是"range/v3/algorithm"
"。
抛开Snark不谈,如果您不喜欢显式地传递begin()
和end()
迭代器,我真的建议您查看Eric Neibler的范围库。即使你不介意这一特定的语法,我还是建议你看看它——我认为这是一个经过深思熟虑的设计,而且它正朝着被纳入C++标准的未来版本的方向发展。
std::sort
适用于范围(由迭代器指定),因此它需要一个开始和结束的位置。它不必对整个容器进行排序。它的指定方式只是最通用的方式。
您可以在cppreference上阅读详细信息:http://en.cppreference.com/w/cpp/algorithm/sort
如果您想了解更多详细信息,请阅读标准:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4582.pdf
范围还不是标准C++库的一部分。更多细节在CppCon 2015:Eric Niebler"标准库范围"。
但是,您可以使用Boost Range库,特别是boost::sort
。
我发现std::sort
有缺陷。是的,确实需要一个迭代器版本(以便能够对容器或动态数组的子范围进行排序)。
然而,它也可以有一个重载,它获取容器并从中获取迭代器
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- 为什么C++sort()函数不以sort(vectorname)形式工作,而以sort形式工作(vectorname.b