如果有人提出任何建议,我将不胜感激:
如何在可以编制索引的varchar字段中有效地存储gps(或任何浮点数).
背景:
我们开发了一个内容管理系统,可以有效地存储任何类型的文件和一组元数据.此文件/元数据存储如下:
file_table metadata_table
---------- --------------
file_id -> file_id (number)
file_name metadata_id (number)
file_location metadata_value (varchar)
...etc
Run Code Online (Sandbox Code Playgroud)
我被要求提供对地理标记文件的支持(即将gps坐标存储为元数据).此外,我们还希望支持具有多个地理标记的文件.
现在据我所知,我有几个选择:
1)将纬度和经度存储在相同的metadata_value varchar中(例如'52.4343242,-1.32324').
我如何查询此字符串?有什么聪明的我可以使用sql,允许我查询字符串的"组件"?我可以将坐标存储为xml字符串 - 这会有帮助吗?如何有效地编入索引?
2)将纬度和经度存储为metadata_table中的单独行.
这个解决方案解决了支持更容易查询的问题(以牺牲复杂性和笨重为代价,特别是当我将为每个文件存储多个地理标记时),但是我仍然面临索引问题.
我可以在查询时将varchars转换为浮点数,但是我不确定这是否会忽略我在metadata_table.metadata_value上的索引并执行表扫描.
3)创建专用浮点字段以存储gps数据.
这是最不可取的选项,因为它违背设计的细节以添加特定元数据的数据库字段.并非所有文件都存储gps数据.
任何帮助或建议表示赞赏.
我目前正在整理一个严重依赖的应用程序,shared_ptr到目前为止一切看起来都很好 - 我已经完成了我的功课,对使用shared_ptrs 的一些陷阱非常了解.
最常见的问题之一shared_ptr是循环依赖 - 这些问题可以通过存储weak_ptr不影响链上对象生命周期的问题来解决.然而,我正在努力解决需要通过以下方式存储指向外部对象的指针weak_ptr- 我不确定它是否被禁止,气馁或是否安全.
下图描述了我的意思(黑色箭头表示shared_ptr;虚线表示weak_ptr):
替代文字http://img694.imageshack.us/img694/6628/sharedweakptr.png
shared_ptr两个子节点,两个子节点都使用a指向父节点weak_ptr. weak_ptr指向第二个子节点的指针并将其存储在本地.代码如下所示:
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
#include <boost/make_shared.hpp>
#include <boost/enable_shared_from_this.hpp>
class child;
class child2;
class parent;
class parent : public boost::enable_shared_from_this<parent>
{
public:
void createChildren()
{
_child2 = boost::make_shared<child2>(shared_from_this());
_child = boost::make_shared<child>(shared_from_this());
}
boost::shared_ptr<child> _child;
boost::shared_ptr<child2> _child2;
};
class child
{
public: …Run Code Online (Sandbox Code Playgroud) 我试图std::locale用美国或英国语言环境字符串实例化一个对象.
双方std::locale loc("en_US")并std::locale loc("en_GB")抛出一个不好的区域设置名称运行时异常.使用""或"C"正常创建区域设置; 但是,我在设置单个国家/地区时遇到问题.
我想这样做的原因是为了单元测试目的,以确保字符串排序方法的集合正常工作.
我还应该指出,我使用Visual Studio 2008在Windows中进行编码,如果可能的话,我希望保持代码跨平台.
为什么以下代码会生成编译错误?
编辑:我的原始代码不清楚 - 我已将代码拆分为单独的文件...
First.h
class First
{
public:
static const char* TEST[];
public:
First();
};
Run Code Online (Sandbox Code Playgroud)
First.cpp
const char* First::TEST[] = {"1234", "5678"};
First::First()
{
uint32_t len = sizeof(TEST); // fine
}
Run Code Online (Sandbox Code Playgroud)
确定First班级中的大小似乎很好,但是......
Second.h
class Second
{
public:
Second();
};
Run Code Online (Sandbox Code Playgroud)
Second.cpp
#include "First.h"
Second::Second()
{
uint32_t len = sizeof(First::TEST); // error
uint32_t elements = (sizeof(First::TEST) / sizeof(First::TEST[0])); // error
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误: 'const char *[]': illegal sizeof operand
我有一个看起来像这样的代码:
struct First
{
int f1;
int f2;
};
struct Second
{
First s1;
int s2;
};
std::vector < Second > secondVec;
Second sec;
sec.s1 = First();
secondVec.push_back(sec);
secondVec.push_back(sec);
std::vector < First > firstVec;
firstVec.reserve(secondVec.size());
for (std::vector < Second >::iterator secIter = secondVec.begin();
secIter != = secondVec.end();
++secIter)
{
firstVec.push_back(secIter->s1);
}
Run Code Online (Sandbox Code Playgroud)
我想for用一个简单的stl函数替换这个丑陋的循环,它可能执行等效的过程.我在想,也许std::transform可以帮助我,但我不确定如何写这个.
我也很有兴趣,如果提升有什么在这里提供.
虽然重构了一些遗留的C++代码,但我发现我可能通过某种方式定义一个可以指向共享相同签名的任何类方法的变量来删除一些代码重复.经过一番挖掘,我发现我可以做以下事情:
class MyClass
{
protected:
bool CaseMethod1( int abc, const std::string& str )
{
cout << "case 1:" << str;
return true;
}
bool CaseMethod2( int abc, const std::string& str )
{
cout << "case 2:" << str;
return true;
}
bool CaseMethod3( int abc, const std::string& str )
{
cout << "case 3:" << str;
return true;
}
public:
bool TestSwitch( int num )
{
bool ( MyClass::*CaseMethod )( int, const std::string& );
switch ( num )
{
case …Run Code Online (Sandbox Code Playgroud) 根据文档,a boost::thread::id可以被认为是每个正在运行的线程的唯一,并且可以在诸如std::set和的容器中使用std::map(因为<操作符被覆盖thread::id).
我的问题是我想thread::id用作一个键boost::unordered_map,但它要求键是"可以"(即支持散列到a size_t).由于thread :: id的所有实现细节都被隐藏了,所以我认为没有任何我可以使用的东西.
所以我的问题是 - 是否可以使用thread :: id作为unordered_map的键?
我们有大型(100,000+元素)结构的有序向量(运算符<重载以提供排序):
std::vector < MyType > vectorMyTypes;
std::sort(vectorMyType.begin(), vectorMyType.end());
Run Code Online (Sandbox Code Playgroud)
我的问题是,在保留排序顺序的同时向这些向量添加新元素时,我们会看到性能问题.目前我们正在做类似的事情:
for ( a very large set )
{
vectorMyTypes.push_back(newType);
std::sort(vectorMyType.begin(), vectorMyType.end());
...
ValidateStuff(vectorMyType); // this method expects the vector to be ordered
}
Run Code Online (Sandbox Code Playgroud)
这不完全是我们的代码看起来的样子,因为我知道这个例子可以用不同的方式进行优化,但是它可以让你了解性能如何成为一个问题,因为我在每一个之后进行排序push_back.
我认为我基本上有两种选择来提高性能:
使用(手工制作?)插入排序而不是std::sort提高排序性能(部分排序的矢量上的插入排序非常快)
通过使用std::make_heap和std::push_heap维护排序顺序来创建堆
我的问题是:
我应该实现插入排序吗?Boost中有什么东西可以帮助我吗?
我应该考虑使用堆吗?我该怎么做?
编辑:
感谢您的所有回复.我理解我给出的示例远非最佳,并且它不能完全代表我现在在代码中的内容.它只是在那里说明我遇到的性能瓶颈 - 也许这就是为什么这个问题没有看到许多上升票:)
非常感谢史蒂夫,这通常是最简单的答案,也许是我对问题的过度分析使我对最明显的解决方案视而不见.我喜欢你概述的简洁方法直接插入预先排序的矢量.
正如我评论的那样,我现在限制使用向量,因此std :: set,std :: map等不是一个选项.
我正在创建一个非侵入式弹出窗口,以便在处理耗时的操作时通知用户.目前我通过调用设置其透明度,SetLayeredWindowAttributes这给了我一个合理的结果:
alt text http://img6.imageshack.us/img6/3144/transparentn.jpg
但是我希望文本和关闭按钮看起来不透明(用白色文字看起来不太正确)同时保持背景透明 - 有没有办法做到这一点?
既然boost::shared_ptr可以非常频繁地调用并简单地返回一个指针,那么->运算符不是一个好的候选者inlined吗?
T * operator-> () const // never throws
{
BOOST_ASSERT(px != 0);
return px;
}
Run Code Online (Sandbox Code Playgroud)
一个好的编译器会自动inline这个吗?
我应该失眠吗?:-)
我正在尝试在Github中创建一个新的存储库,我在使用它的名字时遇到了麻烦.这是一个C++项目,所以我想称之为:
上层项目++
但是Github给我创建了一个repo,其中包含以下网址:
混帐://github.com/alanw/superproject--.git
看起来很糟糕.
这是Github或git本身的约束吗?
我玩了几个替代品,但我不想热衷于:
有任何想法吗?