# The `sort` algorithm

The `sort` algorithm (from the header file `<algorithm>`) has two forms:

• `sort(`begin, end`);`
• `sort(`begin, end, less-than-compare`);`
• Only a single half-open interval is given.
• It’s an in-place sort.
• How do I sort from container1 to container2?

# Containers

• Of course, some containers are intrinsically sorted.
• You might specify a comparison functor for those containers.
• You wouldn’t use the `sort` algorithm for those containers.
• However, you might want to apply the `sort` algorithm to an unsorted container, such as a `std::array`, `vector`, `string`, or even a C array.
• `list` has a `sort` method.

# Default comparison

```string s = "Kokopelli";
sort(s.begin(), s.end());
cout << s << '\n';
```
```Keiklloop
```

# Explicit comparison

```string s = "Kokopelli";
sort(s.begin(), s.end(), less<char>);
cout << s << '\n';
```
```c.cc:2:36: error: expected primary-expression before ')' token
```
• Why doesn’t that work?
• What sort of thing does `sort` want for the third argument?
• What sort of thing is `less<>`?

# Explicit comparison

```string s = "Kokopelli";
sort(s.begin(), s.end(), less<char>());
cout << s << '\n';
```
```Keiklloop
```

# Reverse sort

```string s = "Kokopelli";
sort(s.begin(), s.end(), greater<char>());
cout << s << '\n';
```
```poollkieK
```

# Comparison function

```bool lt(char a, char b) {
return a < b;
}

int main() {
string s = "Kokopelli";
sort(s.begin(), s.end(), lt);
cout << s << '\n';
}
```
```Keiklloop
```

# λ-function

```string s = "Kokopelli";
sort(s.begin(), s.end(),
[](char a, char b){return a<b;});
cout << s << '\n';
```
```Keiklloop
```

# Case folding

```bool lt(char a, char b) {
}

int main() {
string s = "Kokopelli";
sort(s.begin(), s.end(), lt);
cout << s << '\n';
}
```
```eiKklloop
```

# Unique

If you want to avoid duplicates, then use `unique`.

```bool lt(char a, char b) {
}

int main() {
string s = "Kokopelli";
sort(s.begin(), s.end(), lt);
auto it = unique(s.begin(), s.end());
s.resize(it-s.begin());
cout << s << '\n';
}
```
```eiKklop
```

`unique` assumes that its input is in order already.

# Unique

Case-independent uniqueness doesn’t come free:

```bool lt(char a, char b) {
}

bool eq(char a, char b) {
}

int main() {
string s = "Kokopelli";
sort(s.begin(), s.end(), lt);
auto it = unique(s.begin(), s.end(), eq);
s.resize(it-s.begin());
cout << s << '\n';
}
```
```eiKlop
```

User: Guest

Check: HTML CSS
Edit History Source

Modified: 2018-04-24T16:55

Apply to CSU | Contact CSU | Disclaimer | Equal Opportunity
Colorado State University, Fort Collins, CO 80523 USA