【问题标题】:How can I translate this python function to c++?如何将此 python 函数转换为 c++?
【发布时间】:2021-12-12 15:05:47
【问题描述】:

我正在尝试将 python 函数转换为 c++,但没有成功。有人可以帮我吗?

python 函数接收一个字符串 S 和 2 个整数(fragment_size 和 jump)作为输入。 该函数的目的是将字符串 S 切成长度等于输入给定的第一个整数 (fragment_size) 的多个片段,并以等于输入给定的第二个整数的步长遍历整个字符串 S (jump )。

import sys
# First we read the input and asign it to 3 different variables
S = sys.stdin.readline().strip()
fragment_size = sys.stdin.readline().strip()
jump = sys.stdin.readline().strip()

def window(S, fragment_size, jump):
    word = S[:fragment_size]
    if len(word)< fragment_size:
        return []
    else:
        return [word] + window(S[jump:], fragment_size, jump)

# We check that S is not an empty string and that fragment_size and jump are bigger than 0. 
if len(S) > 0 and int(fragment_size) > 0 and int(jump) > 0:
    # We print the results 
    for i in window(S, int(fragment_size), int(jump)):
        print(i)

例如: 输入 ACGGTAGACCT 3 1

输出 ACG CGG GGT 侠盗猎车手 标签 AGA 广汽 ACC 色温

示例 2: 输入 ACGGTAGACCT 3 3

输出 ACG 侠盗猎车手 广汽

我知道如何在 c++ 中在窗口函数中返回一个字符串来解决这个问题。但我确实需要返回一个列表,就像我在 python 程序中返回的那样。

现在,我有这个 C++ 代码:


# include <iostream>
# include <vector>
# include <string>
using namespace std;

vector<string> window_list(string word, vector<vector<string>>& outp_list){
    outp_list.push_back(word);
}

vector<string> window(string s, int len_suf, int jump){
    string word;
    vector<vector<string>> outp_list; 

    word = s.substr(0, len_suf);
    if(word.length() < len_suf){
        return vector<string> window_list();
    }
    else {
        window_list(word, outp_list);
        return window(s.substr(jump), len_suf, jump);
    } 
}

int main(){
    // We define the variables
    string s;
    int len_suf, jump;
    // We read the input and store it to 3 different variables
    cin >> s;
    cin >> len_suf;
    cin >> jump;
    // We print the result
    vector<string> ans = window(s, len_suf, jump);
    for(auto& x: ans){
        cout << x << endl;
    }

    return 0;
}

谢谢!

【问题讨论】:

  • 你能告诉我们你到目前为止做了什么吗?分享您的代码。

标签: python c++ c++11 recursion


【解决方案1】:

您可以使用below 示例中显示的程序:


#include <iostream>
#include <vector>
#include <string>
std::vector<std::string> stringFragmenter(const std::string &inputString, int len, int stepSize)
{
    std::string::const_iterator currentBegin = inputString.begin();
    
    std::string::const_iterator end = inputString.end();
    std::string::const_iterator currentPosition = currentBegin;
    
    std::vector<std::string> output;
    std::string pushedString;
    while(currentPosition + len <= end)
    {
        currentBegin = currentPosition;
        std::string::const_iterator currentEnd = currentBegin + len;
        
       
        
        
        while(currentBegin != currentEnd)
        {
            pushedString+= *currentBegin;
            ++currentBegin;
        }
        output.push_back(pushedString);
        
        currentPosition = currentPosition + stepSize;
        
        //clear the pushedString for next iteration
        pushedString.clear();
        
    }
    return output;
}
int main()
{
    std::string inputString;
    std::cin >> inputString;
    
    int length;//this denotes the length of string that has to be displayed(stored) at each time
    std::cin >> length;
    
    int stepSize;
    std::cin >>stepSize;//this denotes the jump size
    
    
    
    std::vector<std::string> fragmentedString = stringFragmenter(inputString, length, stepSize);
    
    //print out the elements of the returned vector so that we can confirm if it contains the correct elements
    for(const std::string &elem: fragmentedString)
    {
        std::cout<<elem<<std::endl;
    }

    
    return 0;
}


here 所示,上述程序的输出与您的两种输入情况均匹配。

在上述程序中,要输入您的输入 case 1,您应该首先输入字符串 ACGGTAGACCT,然后输入长度 3,最后输入 stepSize(或跳转大小)1,输入/输出如下所示:

ACGGTAGACCT
3
1
ACG
CGG
GGT
GTA
TAG
AGA
GAC
ACC
CCT

与您想要的输出相匹配。对于您的输入案例 2 也是如此。查看输出 here

【讨论】:

    【解决方案2】:

    使用string 数据类型,您可以毫无问题地实现它。您可以使用substr 方法代替python [:] 运算符:

    #include <iostream>
    #include <string.h>
    using namespace std;
    
    string S = "";
    int fragment_size = 0;
    int jump = 0;
    char a_result[1024];
    
    string window(string s) {
        if (s.length() < fragment_size)
            return "";
        else
            return s.substr(0, fragment_size) + " " + window(s.substr(jump));
    }
    
    int main(int argc, char *argv[]) {
        
        cin >> S;
        cin >> fragment_size;
        cin >> jump;
        
        if (S.length() && fragment_size > 0 && jump > 0) {
            string result = window(S);
            
            cout << endl 
                 << result;
            
            // Get array from the string
            strncpy(a_result, result.c_str(), sizeof(a_result));
            a_result[sizeof(a_result) - 1] = 0;
        }
        
        return 0;
    }
    

    此外,在您的 window 函数中,您有一个不需要的额外 for 循环,因为您在第一次迭代后返回了一个值。

    【讨论】:

    • 谢谢亚历山多!
    • @Lous 很高兴为您提供帮助
    • 有没有办法返回一个列表而不是一个字符串?
    • 您可以将字符串作为数组使用,如stringname[n],如果您希望在所有范围内使用全局字符数组,您可以使用strncpy 函数。我会更新答案
    【解决方案3】:

    它可以完成这项工作,但由于我不太喜欢 C++,因此 Alexandros Palacios 的方法可能会更好。这只是对您的 Python 代码的直截了当的翻译。

    #include <strings.h>
    #include <iostream>
    #include <vector>
    
    std::string window(std::string S, int fragment_size, int jump) {
        for (int i = 0; i <= S.length(); jump) {
            std::string word = S.substr(i, i+fragment_size);
            if (word.length() < fragment_size) {
                return "";
            }
            else {
                return word + " " + window(S.substr(jump, S.length()-1), fragment_size, jump);
            }
        }
    }
    
    int main(int argc, char const *argv[])
    {
        std::string S;
        std::cout << "Enter DNA sequence: ";
        std::cin >> S;
        int fragment_size;
        std::cout << "Enter fragment size: ";
        std::cin >> fragment_size;
        int jump;
        std::cout << "Enter jump size: ";
        std::cin >> jump;
        
        std::vector<std::string> data;
        std::string result;
        if (S.length() > 0 && fragment_size > 0 && jump > 0) {
           result = window(S, fragment_size, jump);
        } else {
            return 1;
        }
        size_t pos;
        std::string delimiter = " ";
        while ((pos = result.find(delimiter)) != std::string::npos) {
            data.push_back(result.substr(0, pos));
            result.erase(0, pos + delimiter.length());
        }
        for (const auto &str : data) {
            std::cout << str << " ";
        }
        std::cout << std::endl;
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-10
      • 2013-09-25
      • 1970-01-01
      • 2012-07-26
      • 2014-03-24
      • 2020-06-07
      • 2019-01-01
      相关资源
      最近更新 更多