有没有可用的C++(或C)函数/类/库,只是为了清理可能包含HTML的字符串?
我找到了很多用C#或其他语言进行消毒的源代码,这些语言在Web应用程序中更常用,但在C++中没有.
如果我找不到任何可用的功能,我会尝试实现自己的功能,但我认为经过严格测试的解决方案会好得多.
编辑>对我的需求更精确:
我在C++应用程序中从键盘输入文本.然后我需要在将其用作javascript函数调用中的参数之前对其进行清理.该javascript在加载的html页面中运行,该页面通过库(Navi)显示的纹理中自动呈现(通过Chromium).因此,我使用的javascript函数将简单地采用给定的文本,将P标记放在文本周围并将其注入div中,如下所示:
text_display.innerHTML += text_to_add;
Run Code Online (Sandbox Code Playgroud)
我需要在将文本发送到网页之前对文本进行清理,无论是针对此功能还是其他功能.它必须在Chromium输入之前进行消毒.
这是一个简化的例子:
#include <memory>
#include <vector>
template< class T >
class K
{
public:
virtual ~K(){}
};
class KBOUM : public K<int>{};
template< class U >
void do_something( std::shared_ptr< K<U> > k ) { }
int main()
{
auto kboom = std::make_shared<KBOUM>();
do_something( kboom ); // 1 : error
std::shared_ptr< K<int> > k = kboom; // 2 : ok
do_something( k ); // 3 : ok
}
Run Code Online (Sandbox Code Playgroud)
有或没有boost,无论我使用什么编译器,我都会在#1上遇到错误,因为shared_ptr<KBOOM>不会继承shared_ptr<K<int>>.但是,KBOOM继承自K<int>.您可以看到#2有效,因为shared_ptr旨在允许隐式地将子类指针传递给基类指针,就像原始指针一样.
所以我的问题是:
就C++ 11而言,我认为在至少两个线程之间共享的值 - 语义对象的副本不是线程安全的吗?
这意味着如果我们想在一个线程中获得一个大对象的副本,我们仍然需要一些同步机制来制作副本?
我已经读过某个地方std :: map,当前的编译器,仍然是我们在STL中最有效的关联容器,即使是std :: unsorted_map - 从我在某处读到的,我不知道在哪里 - - 只有当有很多条目时才会在find()上变得更有效率,例如超过40k.
所以现在我不再确定了,因为我总是假设哈希映射更有效率,至少在字符串键的情况下.
简而言之:
如果我必须选择一个具有未知条目计数且使用std :: string作为键的关联容器,那么(至少在理论上)什么(查找速度)更有效(查找速度)选择?
一个小测试程序:
#include <iostream>
const float TEST_FLOAT = 1/60;
const float TEST_A = 1;
const float TEST_B = 60;
const float TEST_C = TEST_A / TEST_B;
int main()
{
std::cout << TEST_FLOAT << std::endl;
std::cout << TEST_C << std::endl;
std::cin.ignore();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果:
0
0.0166667
Run Code Online (Sandbox Code Playgroud)
在Visual Studio 2008和2010上测试过.
我正在使用VS2010.在我的不可兼容的Scene类的构造函数中,我有:
auto& character_mgr = CharacterManager::Instance();
character_mgr.initialize();
character_mgr.add_observer( std::bind( &Scene::on_character_event, *this, std::placeholders::_1, std::placeholders::_2 ) );
Run Code Online (Sandbox Code Playgroud)
这里add_observer定义为:
void add_observer( Observer observer ){ ... }
Run Code Online (Sandbox Code Playgroud)
使用Observer定义为:
typedef std::function< void ( CharacterEvent, const Character& ) > Observer;
Run Code Online (Sandbox Code Playgroud)
问题是编译器告诉我有一个尝试复制我的场景,我在绑定中使用*this,认为它将保留对它的引用,而不是在我复制绑定生成的仿函数时复制它.
我正在使用boost :: date_time并且我得到了一个time_t,它是由库使用C标准库中的time()函数生成的.
我正在寻找从那个时间开始获取当地时间的方法.我正在阅读文档,如果没有提供时区就找不到任何方法,我不知道因为它取决于机器的语言环境,我找不到任何方法从中获取一个.
我错过了什么?
当我写这段代码时:
Animal *p;
Animal b;
p = &b;
Run Code Online (Sandbox Code Playgroud)
在我创建指针的第一行.是创建Animal的新对象还是仅在编写第二行时?
谢谢.