我如何将这个python函数转换为c++?



我试图翻译一个python函数到c++没有成功。有人能帮帮我吗?

python函数接收一个字符串S和两个整数(fragment_size和jump)作为输入。此函数的目的是将字符串S分割成若干长度等于输入(fragment_size)给出的第一个整数的片段,并以等于输入(jump)给出的第二个整数的步长遍历整个字符串S。

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)

例如:输入ACGGTAGACCT3.1

ACGCGGGGT侠盗猎车手标签AGA广汽ACC有条件现金援助

示例2:输入ACGGTAGACCT3.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;
}

谢谢!

它完成了工作,但由于我不是很喜欢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;
}

使用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循环,因为您在第一次迭代后返回一个值,因此不需要它。

您可以使用如下示例所示的程序:


#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;
}

上述程序的输出与您的两个输入情况相匹配,如下所示。

在上面的程序中,要输入输入大小写1,你应该首先输入字符串ACGGTAGACCT,然后输入长度3,最后输入stepSize(或跳转大小)1,输入/输出看起来像:

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

,它与您想要的输出匹配。输入情况2也是一样。查看这里的输出。

最新更新