C******a 发帖数: 32 | 1 考虑有相同元素情形.需要给出compact, clean code, C or C++.
Write a C++ program that print the first longest
ascending or descending contiguous substring for a vector of integers. Given
a vector
4, 2, 1, 2, 3, 4, 3, 5, 1, 2, 4, 6, 5
the program would print:
1, 2, 3, 4
算法不难,但写不出简短的clean code. 欢迎讨论. | t****t 发帖数: 6806 | 2 你先写一个出来大家看看。
Given
【在 C******a 的大作中提到】 : 考虑有相同元素情形.需要给出compact, clean code, C or C++. : Write a C++ program that print the first longest : ascending or descending contiguous substring for a vector of integers. Given : a vector : 4, 2, 1, 2, 3, 4, 3, 5, 1, 2, 4, 6, 5 : the program would print: : 1, 2, 3, 4 : 算法不难,但写不出简短的clean code. 欢迎讨论.
| C******a 发帖数: 32 | 3 thrust, 请指出我的语法错误, 谢谢!
I am thinking about sth like but does not compile:
template
class LongestSubstr
{
..................
public:
void operator() (int elem)
{
if (Compare_lessequal(current, elem))
{
.....
}
....
}
};
int main()
{
...................
LongestSubstr() >
【在 t****t 的大作中提到】 : 你先写一个出来大家看看。 : : Given
| X****r 发帖数: 3557 | 4 你混淆了类和对象。23行应该调用一个Compare_lessequal类的实例的operator(),
这个实例可以从LongestSubstr的构建函数中传进来。
【在 C******a 的大作中提到】 : thrust, 请指出我的语法错误, 谢谢! : I am thinking about sth like but does not compile: : template : class LongestSubstr : { : .................. : public: : void operator() (int elem) : { : if (Compare_lessequal(current, elem))
| z****e 发帖数: 2024 | 5 我写了一个,运行貌似可以。
但是有一个极其诡异的bug
在 longest_mono_seq ::operator() 里面,如果把开头的四个打印语句去掉,运行结
果完全错误。
可是那几个打印是take const的,不会修改的呀?
很奇怪。我也解释不了。
#include
#include
#include
#include
using namespace std;
template//a template to print container
void prints(const Con& c, string name){
cout<
typename Con::const_iterator it=c.begin();
for(;it!=c.end();++it){
cout<<*it<<" ";
}
cout<
}
class longest_mono_seq{//the core function object | t****t 发帖数: 6806 | 6 functor in for_each can have local state. | t****t 发帖数: 6806 | 7 why do you put prev as an auto variable? shouldn't it be a part of the state?
【在 z****e 的大作中提到】 : 我写了一个,运行貌似可以。 : 但是有一个极其诡异的bug : 在 longest_mono_seq ::operator() 里面,如果把开头的四个打印语句去掉,运行结 : 果完全错误。 : 可是那几个打印是take const的,不会修改的呀? : 很奇怪。我也解释不了。 : #include : #include : #include : #include
| t****t 发帖数: 6806 | 8 and, why do you guys all want to use functors? what's the benefit? functors
do not mean "clean code" automatically.
state?
【在 t****t 的大作中提到】 : why do you put prev as an auto variable? shouldn't it be a part of the state?
| z****e 发帖数: 2024 | 9 是的,把prev 改成一个private 就对了。
state?
【在 t****t 的大作中提到】 : why do you put prev as an auto variable? shouldn't it be a part of the state?
| z****e 发帖数: 2024 | 10 是的,把prev 改成一个private 就对了。
即使把打印去掉,也是对的了。 | | | C******a 发帖数: 32 | 11 多谢大家,我已经fixed my compiler error, final version pretty close to zaoxie
's.
thrust 大侠,我用functor的原因是make a generic version.当然在这个例子里没有明
显的优点.
Given
【在 C******a 的大作中提到】 : 考虑有相同元素情形.需要给出compact, clean code, C or C++. : Write a C++ program that print the first longest : ascending or descending contiguous substring for a vector of integers. Given : a vector : 4, 2, 1, 2, 3, 4, 3, 5, 1, 2, 4, 6, 5 : the program would print: : 1, 2, 3, 4 : 算法不难,但写不出简短的clean code. 欢迎讨论.
| z****e 发帖数: 2024 | 12 如下这个用了两次扫,读起来更好些吧。prints 用前面那个。
这个你说算不算compact and clearn 了?
template
class longest_mono_seq{
public:
longest_mono_seq():cnt(true){ }
void operator()(const int¤t){
if(cnt){
prev=current;
cnt=false;
return;
}
if(Comp(current, prev)){
if (vtmp.size()==0) vtmp.push_back(prev);
vtmp.push_back(current);
}
else{
if(vtmp.size()>vstore.size())
vtmp.swap(vstore);
vtmp.clear();
}
prev=current;
}
operator vect | C******a 发帖数: 32 | 13 This looks good and,
1) you don't really need a temp vector;
2) do you consider cases like 1 1 1 3 3 2 2 ?
【在 z****e 的大作中提到】 : 如下这个用了两次扫,读起来更好些吧。prints 用前面那个。 : 这个你说算不算compact and clearn 了? : template : class longest_mono_seq{ : public: : longest_mono_seq():cnt(true){ } : void operator()(const int¤t){ : if(cnt){ : prev=current; : cnt=false;
| z****e 发帖数: 2024 | 14 could you please show me how to avoid using a tmp vector?
i didn't consider equality and equivalence.
【在 C******a 的大作中提到】 : This looks good and, : 1) you don't really need a temp vector; : 2) do you consider cases like 1 1 1 3 3 2 2 ?
| C******a 发帖数: 32 | 15 you just remember offset and length of longest substring found so far.
【在 z****e 的大作中提到】 : could you please show me how to avoid using a tmp vector? : i didn't consider equality and equivalence.
| z****e 发帖数: 2024 | 16 thanks。it's far more efficient than storing a vector.
【在 C******a 的大作中提到】 : you just remember offset and length of longest substring found so far.
| b******o 发帖数: 5644 | 17 很久没写C++了。如果不是什么class的东西。用值做map的key,然后把key一列,全解
决。 | b******o 发帖数: 5644 | 18 很久没写C++了。如果不是什么class的东西。用值做map的key,然后把key一列,全解
决。 |
|