用不同参数类型变换二进制运算函数

时间:2015-04-17 05:01:26

标签: c++ c++11 std stl-algorithm

我正在尝试使用std::transform编辑字符串以输出以下内容:

a  
bcd  
efghi  
jklmnop  
qrstuvwxy  
z{abcdefghi  
jklmnopqrstuv  
wxyz{abcdefghij  
klmnopqrstuvwxyz{  
abcdefghijklmnopqrs  
tuvwxyz{abcdefghijklm  
nopqrstuvwxyz{abcdefghi  
jklmnopqrstuvwxyz{abcdefg  

我的变换二元运算函数有两个不同类型的参数(stringsize_t)。这样做有效/可能吗?我也通过引用传递第二个arg,所以我可以更改/增加它,这是有效/可能吗?

我是否应该更改机智并使用命名空间algorithm中的其他功能来实现此目的?也许shuffle,是否有< C ++ 11可以实现这个功能吗?

void solution1()
{
    // Easy solution

    std::string testStr = "abcdefghijklmnopqrstuvwxyz{";
    size_t index = 1;

    while (index < testStr.length()) {

        std::string back  = testStr.substr(0, index);
        std::string front = testStr.substr(index, std::string::npos);

        testStr = front + back;
        index += 2;
        std::cout << back << std::endl;
    }
}

// anyway to initialise gIndex to 1?
std::string outputOddGroup(std::string str, size_t& gIndex)
{
    // Is there a better way to split and rebuild the string? 
    std::string back  = str.substr(0, gIndex);
    std::string front = str.substr(gIndex, std::string::npos);

    gIndex += 2;
    std::cout << back << std::endl;
    return front + back;
}

void solution2()
{
    std::string testStr = "abcdefghijklmnopqrstuvwxyz{";
    std::transform(testStr.begin(), testStr.end(), testStr.begin(), outputOddGroup);
}

2 个答案:

答案 0 :(得分:1)

我不确定我是否完全了解您的需求,但该解决方案如何:

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

int main()
{
    std::string testStr = "abcdefghijklmnopqrstuvwxyz{";
    for(size_t i = 0; i < 13; ++i)
    {
        std::cout << testStr.substr(0, i*2 + 1) << "\n";
        std::rotate(testStr.begin(), testStr.begin() + i*2 + 1, testStr.end());
    }
    return 0;
}

我使用了13次迭代来模仿原始输出,因此您可以将其更改为您需要的任何数字。

答案 1 :(得分:0)

std::transformstd::shufflestd::random_shuffle)都不能解决您的问题。请参阅cppreference了解其用法。无论如何,这是我的解决方案,它运行有效。

int main() {
    std::string str = "abcdefghijklmnopqrstuvwxyz{";
    for (int cnt = 1, i = 0; cnt < str.size(); cnt += 2) {
        for (int n = cnt; n; --n) {
            std::cout << str[i];
            i = (i + 1) % str.size();
        }
        std::cout << std::endl;
    }
    return 0;
}