最近我遇到了一个很好的问题,它很容易理解,很难找到任何解决方法.问题是:
编写一个程序,从输入中读取文本并在输出上打印一些其他程序.如果我们编译并运行打印的程序,它必须输出原始文本.
输入文本应该相当大(超过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
问题描述:
考虑一些有std::string name
成员的结构.为清楚起见,我们假设它是a struct Human
,代表人们的信息.除此之外,name
它还可以有许多其他数据成员.
让一个容器std::vector<Human> vec
,对象已经排序name
.同样为了清楚,假设所有名称都是唯一的.
问题是:nameToFind
如果数组中存在具有此名称的元素,请找出一些字符串.
解决方案和我的进展:
明显和自然的解决方案似乎使用该std::binary_search
功能执行二进制搜索.但是存在一个问题:被搜索的元素std::string
的类型(Human
)与容器()中元素的类型不同,并且std :: binary_search需要一个规则来比较这些元素.我尝试用三种方式解决这个问题,如下所述.前两个是为了说明我的解决方案的演变和我遇到的问题.我的主要问题涉及第三个问题.
尝试1:转换std::string
为Human
.
写一个比较函数:
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) 什么(如果有的话)是从标准输入读取一行的以下两种方法之间的差异:raw_input()
和sys.stdin.readline()
?在哪种情况下,这些方法中的一种优于另一种?
在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
.
标题中已经存在的问题 - 如何使python脚本等到使用os.system()调用启动某个进程完成后?例如代码就像
for i in range( 0, n ):
os.system( 'someprog.exe %d' % i )
Run Code Online (Sandbox Code Playgroud)
这会同时启动请求的过程n次,这可能会让我的电脑出汗一点)
谢谢你的建议.
考虑以下功能:
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
.
问题简而言之:
如何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%被动.
第二种方法:从中
继承一个类,并实现其方法,如:DoubleSender
Sender
void DoubleSender::sendMessage( ... )
{
Sender::sendMessage(...);
Sender::sendMessage(...);
}
Run Code Online (Sandbox Code Playgroud)
嗯,这是可以接受的,但需要很多不愉快的代码空间(真的很多,因为有很多不同的send..
方法.
第三种方法:
想象一下我使用的是c ++ 11 :).然后我可以使这个类通用,并根据tempalte参数生成代码的必要部分 …
请考虑以下代码.
#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 x
地string
根据给定转换为operator string ()
然后使用operator < ( string, string )
?
我正在尝试使用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++03 标准告诉我们,将按位移位运算符应用于有符号类型的结果可以是 UB 和 Impl。定义为负值。我的问题如下:为什么对于操作符<<
它有未定义的行为,而对于操作符>>
它只是实现定义的?是否有严格的原因导致结果<<
也不能被实现定义?
提前致谢。