寻找标准算法来替换简单的 for 循环
looking for an std algorithm to replace a simple for-loop
库中是否有执行以下 for 循环工作的标准算法?
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
int main( )
{
const char oldFillCharacter { '-' };
std::vector<char> vec( 10, oldFillCharacter ); // construct with 10 chars
// modify some of the elements
vec[1] = 'e';
vec[7] = 'x';
vec[9] = '{';
const char newFillCharacter { '#' };
for ( auto& elem : vec ) // change the fill character of the container
{
if ( elem == oldFillCharacter )
{
elem = newFillCharacter;
}
}
// output to stdout
std::copy( std::begin( vec ), std::end( vec ),
std::ostream_iterator<char>( std::cout, " " ) );
std::cout << '\n';
/* prints: # e # # # # # x # { */
}
如果可能的话,我想用 one-liner 替换上面的 range-based for-loop。有什么功能可以做到这一点吗?我看了std::for_each,但我想它不适合这种情况。
您可以使用 std::for_each
.
std::for_each(vec.begin(), vec.end(), [](char& elem) {
if ( elem == oldFillCharacter ) elem = newFillCharacter;
});
此循环将用 newFillCharacter
替换每次出现的 oldFillCharacter
。如果你不想做更花哨的东西 std::replace
看起来不错:
std::replace(std::begin(vec), std::end(vec), oldFillCharacter, newFillCharacter);
或者使用 std::ranges::replace
更简单一些:
std::ranges::replace(vec, oldFillCharacter, newFillCharacter);
std::replace(vec.begin(), vec.end(), '_', '#');
库中是否有执行以下 for 循环工作的标准算法?
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
int main( )
{
const char oldFillCharacter { '-' };
std::vector<char> vec( 10, oldFillCharacter ); // construct with 10 chars
// modify some of the elements
vec[1] = 'e';
vec[7] = 'x';
vec[9] = '{';
const char newFillCharacter { '#' };
for ( auto& elem : vec ) // change the fill character of the container
{
if ( elem == oldFillCharacter )
{
elem = newFillCharacter;
}
}
// output to stdout
std::copy( std::begin( vec ), std::end( vec ),
std::ostream_iterator<char>( std::cout, " " ) );
std::cout << '\n';
/* prints: # e # # # # # x # { */
}
如果可能的话,我想用 one-liner 替换上面的 range-based for-loop。有什么功能可以做到这一点吗?我看了std::for_each,但我想它不适合这种情况。
您可以使用 std::for_each
.
std::for_each(vec.begin(), vec.end(), [](char& elem) {
if ( elem == oldFillCharacter ) elem = newFillCharacter;
});
此循环将用 newFillCharacter
替换每次出现的 oldFillCharacter
。如果你不想做更花哨的东西 std::replace
看起来不错:
std::replace(std::begin(vec), std::end(vec), oldFillCharacter, newFillCharacter);
或者使用 std::ranges::replace
更简单一些:
std::ranges::replace(vec, oldFillCharacter, newFillCharacter);
std::replace(vec.begin(), vec.end(), '_', '#');