小编Gri*_*yan的帖子

编写一个程序,将文本作为输入,并生成一个再现该文本的程序

最近我遇到了一个很好的问题,它很容易理解,很难找到任何解决方法.问题是:

编写一个程序,从输入中读取文本并在输出上打印一些其他程序.如果我们编译并运行打印的程序,它必须输出原始文本.

输入文本应该相当大(超过10000个字符).

唯一(也是非常强大)的要求是存档的大小(即打印的程序)必须严格小于原始文本的大小.这使得不可能出现明显的解决方

std::string s;
/* read the text into s */
std::cout << "#include<iostream> int main () { std::cout<<\"" << s << "\"; }";
Run Code Online (Sandbox Code Playgroud)

我相信这里会使用一些归档技术.

c++ compression algorithm lossless-compression data-compression

35
推荐指数
3
解决办法
2781
查看次数

对std :: binary_search的神秘限制

问题描述:
考虑一些有std::string name成员的结构.为清楚起见,我们假设它是a struct Human,代表人们的信息.除此之外,name它还可以有许多其他数据成员.
让一个容器std::vector<Human> vec,对象已经排序name.同样为了清楚,假设所有名称都是唯一的.
问题是:nameToFind如果数组中存在具有此名称的元素,请找出一些字符串.

解决方案和我的进展:
明显和自然的解决方案似乎使用该std::binary_search功能执行二进制搜索.但是存在一个问题:被搜索的元素std::string的类型(Human)与容器()中元素的类型不同,并且std :: binary_search需要一个规则来比较这些元素.我尝试用三种方式解决这个问题,如下所述.前两个是为了说明我的解决方案的演变和我遇到的问题.我的主要问题涉及第三个问题.

尝试1:转换std::stringHuman.

写一个比较函数:

bool compareHumansByNames( const Human& lhs, const Human& rhs )
{
   return lhs.name < rhs.name;
}
Run Code Online (Sandbox Code Playgroud)

然后添加一个构造函数,该构造函数构造一个Human对象std::string:

struct Human
{
   Human( const std::string& s );
   //... other methods

   std::string name;
   //... other members
};
Run Code Online (Sandbox Code Playgroud)

并使用以下形式的binary_search:

std::binary_search( vec.begin(), vec.end(), nameToFind, compareHumansByNames ); …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm search standards stl

28
推荐指数
2
解决办法
2095
查看次数

从Python中的标准输入读取一行

什么(如果有的话)是从标准输入读取一行的以下两种方法之间的差异:raw_input()sys.stdin.readline()?在哪种情况下,这些方法中的一种优于另一种?

python language-features input

26
推荐指数
2
解决办法
5万
查看次数

函数返回指针自身?

在C++中是否可以编写一个返回指向自身的指针的函数?

如果不是,请提出一些其他解决方案以使以下语法有效:

some_type f ()
{
    static int cnt = 1;
    std::cout << cnt++ << std::endl;
}
int main ()
{
    f()()()...(); // n calls
}
Run Code Online (Sandbox Code Playgroud)

这必须打印从1到1的所有数字n.

c++

24
推荐指数
3
解决办法
4574
查看次数

Python:等待外部启动的流程完成

标题中已经存在的问题 - 如何使python脚本等到使用os.system()调用启动某个进程完成后?例如代码就像

    for i in range( 0, n ):
       os.system( 'someprog.exe %d' % i )
Run Code Online (Sandbox Code Playgroud)

这会同时启动请求的过程n次,这可能会让我的电脑出汗一点)

谢谢你的建议.

python system-calls

20
推荐指数
2
解决办法
5万
查看次数

获取模板可调用对象的参数类型

考虑以下功能:

template<class F>
void register_handler( F& f ) // any callable object
{
   // find out T - the argument type of f
}
Run Code Online (Sandbox Code Playgroud)

f是一个可调用的对象,接受一个参数.它可以是函数指针,也可以std::function是结果std::bind.

问题是,如何确定参数类型f并根据该类型执行某些操作?


一个简单的解决方法是明确地将类型添加到模板中,例如

template<class T, class F> // T is the argument type of F
void register_handler( F& f )
Run Code Online (Sandbox Code Playgroud)

但这似乎有点过分,因为类型F应该已经包含有关类型的必要信息T.

c++ templates template-meta-programming c++11

17
推荐指数
3
解决办法
5383
查看次数

如果在普通的c ++中是静态的?

问题简而言之:
如何static if在普通的c ++中实现c ++ 11中提出的功能?

历史和原始问题:
最近我提出了这样的问题.我需要一个Sender类似界面的类

class Sender
{
   void sendMessage( ... );
   void sendRequest( ... );
   void sendFile( ... );
   // lots of different send methods, not important actually
}
Run Code Online (Sandbox Code Playgroud)

在某些情况下,我需要创建一个DoubleSender,即这个类的一个实例,它会调用它的方法两次,即在调用时,比方说,一个sendMessage(...)方法,必须发送两次相同的消息.

我的解决方案:
第一种方法:
拥有一名isDouble成员,并在每次方法调用结束时进行检查

sendMessage(...) { ... if( isDouble ) { sendMessage( ... ); }
Run Code Online (Sandbox Code Playgroud)

好吧,我不想要这个,因为实际上我最近需要双重发布,这部分时间关键部分的代码将是98%被动.

第二种方法:从中
继承一个类,并实现其方法,如:DoubleSenderSender

void DoubleSender::sendMessage( ... )
{
   Sender::sendMessage(...);
   Sender::sendMessage(...);
}
Run Code Online (Sandbox Code Playgroud)

嗯,这是可以接受的,但需要很多不愉快的代码空间(真的很多,因为有很多不同的send..方法.

第三种方法:
想象一下我使用的是c ++ 11 :).然后我可以使这个类通用,并根据tempalte参数生成代码的必要部分 …

c++ performance static c++11 static-if

12
推荐指数
3
解决办法
8230
查看次数

为什么编译器不执行类型转换?

请考虑以下代码.

#include <iostream>
#include <string>

struct SimpleStruct
{
    operator std::string () { return value; }
    std::string value;
};

int main ()
{
    std::string s;    // An empty string.
    SimpleStruct x;   // x.value constructed as an empty string.

    bool less = s < x; // Error here.
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

此代码不能在g ++或Microsoft Visual C++上编译.编译器给出的错误报告是no match for operator '<' in 's < x'.问题是为什么编译器不是简单SimpleStruct xstring根据给定转换为operator string ()然后使用operator < ( string, string )

c++ operators type-conversion

10
推荐指数
1
解决办法
334
查看次数

使用可变参数模板的多键映射

我正在尝试使用c ++中的可变参数模板实现具有不同访问密钥的映射.我想得到的是使这样的语法工作:

MultikeyMap<int, double, float> map1; // int and double are keys, float is value type 
map1[ 2 ] = 3.5;
map1[ 5.7 ] = 22;

MultikeyMap<unsigned long long, int, float, double, int> map2; // more keys, int is value type
map2[100000000000ULL] = 56;

// etc...
Run Code Online (Sandbox Code Playgroud)

我现在看起来像:

template<class V, class... Krest>
class MultikeyMap;

template<class V, class K, class... Krest>
class MultikeyMap<V, K, Krest...> : protected std::map<K, V>,
                                    protected MultikeyMap<V, Krest...>
{
public:
    template<class T>
    void insert( const T& t, const …
Run Code Online (Sandbox Code Playgroud)

c++ templates variadic variadic-templates c++11

6
推荐指数
1
解决办法
1034
查看次数

将按位移位运算符应用于有符号类型:UB 和 Impl。定义

C++03 标准告诉我们,将按位移位运算符应用于有符号类型的结果可以是 UB 和 Impl。定义为负值。我的问题如下:为什么对于操作符<<它有未定义的行为,而对于操作符>>它只是实现定义的?是否有严格的原因导致结果<<也不能被实现定义?
提前致谢。

c++ bit-shift

5
推荐指数
1
解决办法
618
查看次数