...
| Code Block | ||||
|---|---|---|---|---|
| ||||
#include <iostream>
#include <string>
void g(std::string &&v) {
std::cout << v << std::endl;
}
void f() {
for (unsigned i = 0; i < 10; ++i) {
std::string s(1, static_cast<char>('0' + i));
g(std::move(s));
}
} |
...
Noncompliant Code Example
...
In this noncompliant code example, elements matching 42 are removed from the given container. The contents of the container are then printed to the standard output stream. However, if any elements were removed from the container, the range-based for loop iterates over an invalid iterator range, resulting in unspecified behavior.
| Code Block | ||||
|---|---|---|---|---|
| ||||
#include <algorithm>
#include <iostream>
#include <vector>
void f(std::vector<int> &c) {
std::remove(c.begin(), c.end(), 42);
for (auto v : c) {
std::cout << "Container element: " << v << std::endl;
}
} |
Compliant Solution
In this compliant solution, elements removed by the standard algorithm are skipped during iteration.
| Code Block | ||||
|---|---|---|---|---|
| ||||
#include <algorithm>
#include <iostream>
#include <vector>
void f(std::vector<int> &c) {
auto e = std::remove(c.begin(), c.end(), 42);
for (auto i = c.begin(); i != c.end(); i++) {
if (i < e) {
std::cout << *i << std::endl;
}
}
} |
Compliant Solution
...
In this compliant solution, elements removed by the standard algorithm are subsequently erased from the given container. This technique ensures that a valid iterator range is used by the range-based for loop.
...
| Code Block | ||||
|---|---|---|---|---|
| ||||
#include <algorithm>
#include <iostream>
#include <vector>
void f(std::vector<int> &c) {
c.erase(std::remove(c.begin(), c.end(), 42), c.end());
for (auto v : c) {
std::cout << "Container element: " << v << std::endl;
}
} |
...