我有以下代码
#include <iostream>
#include <string>
using namespace std;
string generate(){
for (char c1='A';c1<='Z';c1++){
for (char c2='A';c2 <='Z';c2++){
for (char c3='A';c3<='Z';c3++){
for (char c4='A';c4<='Z';c4++){
return (new string *)(c1) + (new string*)(c2)+(new string*)(c3)+(new string*)(c4);
}
}
}
}
}
int main(){
return 0;
}
我想生成字符串,但这里是错误
1>------ Build started: Project: string_combinations, Configuration: Debug Win32 ------
1>Build started 9/11/2010 12:42:08 PM.
1>InitializeBuildStatus:
1> Touching "Debug\string_combinations.unsuccessfulbuild".
1>ClCompile:
1> string_combinations.cpp
1>c:\users\david\documents\visual studio 2010\projects\string_combinations\string_combinations\string_combinations.cpp(11): error C2064: term does not evaluate to a function taking 1 arguments
1>c:\users\david\documents\visual studio 2010\projects\string_combinations\string_combinations\string_combinations.cpp(11): error C2064: term does not evaluate to a function taking 1 arguments
1>c:\users\david\documents\visual studio 2010\projects\string_combinations\string_combinations\string_combinations.cpp(11): error C2064: term does not evaluate to a function taking 1 arguments
1>c:\users\david\documents\visual studio 2010\projects\string_combinations\string_combinations\string_combinations.cpp(11): error C2064: term does not evaluate to a function taking 1 arguments
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:00.82
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
请帮助我很困惑为什么我不能通过此方法字符串(char)直接从char转换为字符串
答案 0 :(得分:5)
我很确定使用std::next_permutation可以避免手动循环。这样的手动循环很糟糕,特别是当标准库预见到这种情况时。
这是一些快速代码:
#include <algorithm>
using std::next_permutation;
#include <iostream>
using std::cout;
using std::endl;
#include <string>
using std::string;
int main()
{
string currentPermutation = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
size_t i=0;
do
{
cout << "permutation " << i << ": " << currentPermutation << endl;
++i;
} while( next_permutation(currentPermutation.begin(), currentPermutation.end()) );
return 0;
}
这将排列字符串的所有组合。
答案 1 :(得分:3)
问题出在这个表单的表达式上:
(new string *)(c1)
左手边不是一个类型,它是一个表达式。当您使用另一个带括号的表达式对其进行后缀时,它看起来像一个函数调用,但只有在左表达式是函数名或函数指针时才有效。在这种情况下,新表达式的类型std::string**
不是函数指针。
要从单个char
构造临时字符串,不应使用动态分配对象的new
;相反,你可以使用一个构造函数。合适的一个是计数和char
重复该计数的一个。在您的情况下,计数为1是您想要的:
std::string(1, c1);
你可以做类似的事情。
return std::string(1, c1) + std::string(1, c2);
请注意,您也不会在任何地方调用generate,如果从return
循环的第一次迭代中执行for
,您将不会迭代所有组合,您将只会每一个都会产生第一个组合。
答案 2 :(得分:2)
您应该使用stringstream创建字符串,如下所示:
stringstream s;
s << c1 << c2 << c3 << c4 << ends;
return s.str();
答案 3 :(得分:-1)
所以,我看到你在使用VC ++ 10:
#include <array>
#include <algorithm>
#include <list>
#include <string>
int main() {
std::array<char, 24> tAlphabet = {
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', // and so on...
};
// you could store permutations here, but there will be really, really many of them
std::list<std::string> tAllPermutations;
do {
std::string tCurrentPermutation;
std::for_each(tAlphabet.begin(), tAlphabet.end(),
[&tCurrentPermutation] (char tCurrentChar) -> void {
tCurrentPermutation += tCurrentChar;
});
std::cout << tCurrentPermutation << std::endl;
} while (std::next_permutation(tAlphabet.begin(), tAlphabet.end()));
}