C ++ String insert iteration

时间:2017-07-11 10:15:47

标签: c++ string

我有字符串:

string str = "1234567890";

//Magic code

cout<<str<<endl;

我要输出的内容:12 34 56 78 90

我认为std有一些简洁的功能/功能来帮助解决这个问题。我怎么用最方便的方式?

3 个答案:

答案 0 :(得分:2)

带有for循环的std::string::insert可以帮助您轻松地将空格插入std::string

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main() {
    string str = "1234567890";

    for(auto it = str.begin(); it != str.end(); it += min<int>(str.end() - it, 2))
        it = (it != str.begin() ? str.insert(it, ' ') + 1 : it);

    cout << str << endl;
}

std::string::insert返回指向插入字符的迭代器,因此必须递增以逐步插入插入的字符。

因为std::string有一个random-access iterator,所以它可以递增或递减一个以上。 min<int>(str.end() - it, 2)确保下一步不会超出界限。

答案 1 :(得分:1)

更通用的方法。定义一个函数,将每个char_to_insert个字符中的给定字符s插入给定字符interval,不包括字符串的开头和结尾:

std::string insert_char(const std::string& s, char char_to_insert, size_t interval)
{
    // corner cases
    if (!interval || !s.length()) return s;

    // compute number of characters to insert
    auto number_of_chars_to_insert = (s.length()-1)/interval;

    // compute total length
    auto output_length = s.length() + number_of_chars_to_insert;

    // pre-allocate output string with all characters equal to char_to_insert
    std::string retval(output_length, char_to_insert);

    // cycle input string, keeping track of position in input and output strings
    size_t pos = 0, pos_in_input = 0;
    for (const auto& c : s)
    {
        // copy from input to output
        retval[pos++] = c;

        // advance in output every interval chars
        if ((++pos_in_input) % interval == 0)
            ++pos;
    }
    return retval;
}

然后:

int main()
{
    std::string s = "1234567890";
    for (size_t i = 1; i != 5; ++i)
        std::cout << insert_char(s, ' ', i) << std::endl;
    return 0;
}

输出:

1 2 3 4 5 6 7 8 9 0
12 34 56 78 90
123 456 789 0
1234 5678 90

答案 2 :(得分:0)

没有内置功能可以执行您想要的操作。 相反,最方便的解决方案可能是迭代遍历字符串并输出数字对:

string str = "1234567890";
for (auto it = str.begin(); it != str.end(); ++it){
    std::cout << *(it);
    if (++it != str.end()){
        std::cout << *it << " ";
    }
}
std::cout << std::endl;

或非迭代器版本:

string str = "1234567890";
for (idx = 0; idx < str.length(); idx += 2){
    std::cout << str.substr(idx, 2) << " ";
}
std::cout << std::endl;

这两个示例都会在行上有一个尾随空格,但我已将其保留以使示例更简单。