c++中std::sort的正确使用

Proper use of std::sort in c ++

例如我有一个包含以下内容的字符串数据

std :: string words {"armando dippet"};

如果使用

words.begin () / end () 就可以了,

但是如果

std :: string words [] {"gandalf", '"harry", "malfoy", "ron"}

使用

std::sort(words.begin () / end ())

不行,必须改成

std :: sort (std :: begin (words), std :: end (words))

std :: sort (words, words + sizeof ( words) / sizeof (words [0]))

为了运行,然后我改用动态字符串

std :: string * words {new std :: string [2] {"hermione", "aziz"}}

使用

std::sort(std :: begin (words) / end (words))

没用,使用

std::sort(words-> begin () words -> end ())

成功但结果不合适,使用

std :: sort (words, words + sizeof (words) / sizeof (words [0]))

成功

老实说,我对 sort 的使用感到困惑

倒退

std::string * dynamic_length {new std :: string [2] {"hermione", "aziz"}};

指针不是数组。它们没有长度,因此您必须在别处记录。

std::sort(dynamic_length, dynamic_length + 2);

数组缺少方法。它们只是一个连续的值序列。数组类型保存长度。

std::string static_length[] {"gandalf", '"harry", "malfoy", "ron"}; // declares a std::string[4]

存在从数组到指针的隐式转换。

std::sort(static_length, static_length + 4);

std 有一对对数组进行操作的函数模板(还有其他重载)

std::sort(std::begin(static_length), std::end(static_length));

begin 只是将数组转换为指针。 end 额外添加取自类型的长度。

template <typename T, size_t N>
T * end(T(&arr)[N]) // this is the syntax for passing an array reference
{ return arr + N; }

你应该使用的是一个实际的容器,比如std::vector<std::string>

std::vector<std::string> words {"gandalf", '"harry", "malfoy", "ron"};

它有成员 beginend,自由函数的重载 beginend,以及其他

std::sort(words.begin(), words.end()); // member
std::sort(std::begin(words), std::end(words)); // free function
std::sort(words.data(), words.data() + words.size()); // vector converts to pointer too
std :: string * words {new std :: string [2] {"hermione", "aziz"}}
std :: sort (words, words + sizeof (words) / sizeof (words [0]))

is successful

它是“成功的”,因为参数的类型是迭代器,因此格式正确。

但是你的结束指针的指针算法是错误的,并且根据 std::string 的大小,它可能会超出数组导致未定义的行为(在一般情况下;不一定在这一个),或者它可能会导致一开始就没有任何排序,或者介于两者之间。简而言之,计算与数组的长度没有任何关系。

这是正确的版本:

std::sort(words, words + 2);

P.S。避免使用拥有裸指针。