我需要将一个字符插入一个按字母顺序排列的字母串中,并且这个字符必须按字母顺序放在它所属的位置。
例如,我有字符串{
60: 1,
30: 3,
20: 3,
10: 3
}
和输入代码
string myString("afgjz");
但是我怎样才能这样做,以便在输入char之后(比如说b)然后将它添加到正确位置的字符串中,从而导致字符串变为“abfgjz”。
答案 0 :(得分:2)
您可以使用std::lower_bound
找到要插入的位置。
myString.insert(std::lower_bound(myString.begin(), myString.end(), ch), ch);
更通用的解决方案是拥有类似
的功能namespace sorted
{
template<class Container, class T>
void insert(Container & object, T const & value)
{
using std::begin;
using std::end;
object.insert(std::lower_bound(begin(object),
end(object), value), value);
}
}
然后使用
sorted::insert(myString, ch);
答案 1 :(得分:1)
类std :: string具有以下插入方法(除了其他插入方法之外):
iterator insert(const_iterator p, charT c);
所以你需要的只是找到必须插入新角色的位置。如果字符串已经具有相同的字符,则有两种方法:在字符串中存在的字符之前插入新字符,在这种情况下,您应该使用标准算法std::lower_bound
或者在存在之后插入新字符字符串中的字符,在这种情况下,您应该使用标准算法std::upper_bound
。
这是一个演示程序,显示如何使用标准算法std::upper_bound
完成此操作。如果您愿意,可以将其替换为std::lower_bound
。虽然在我看来最好在现有字符之后插入新字符,因为在某些情况下你可以避免在插入新字符的目标位置之后移动字符。
#include <iostream>
#include <algorithm>
#include <string>
int main()
{
std::string myString( "afgjz" );
char c = 'b';
myString.insert( std::upper_bound( myString.begin(), myString.end(), c ), c );
std::cout << myString << std::endl;
return 0;
}
程序输出
abfgjz