在开始之前,我需要声明我的应用程序使用了很多字符串,这些字符串平均很小,并且一旦创建就不会更改.
在Visual Studio 2010中,我注意到std :: string的容量至少为30.即使我写std::string str = "test";了,str的容量也是30. str.shrink_to_fit()尽管std ::存在一个具有相同名称的函数,但该函数对此没有任何作用.矢量和按预期工作,即减少容量,使容量==大小.
std::string::shrink_to_fit()预期工作?问题 1:我在 Python 中有一个 SQLite3 连接。如何检查它是否已连接?我知道如果 sqlite3.connect() 失败,则会引发异常,但是如果我或某些人关闭了连接,我该如何检查并在必要时重新打开它?
问题 2:我可以在连接打开时移动文件系统中的文件(无法删除)。无论出于何种原因,数据库随后变为只读。如果我把它移回去,它就好像什么都没发生一样。有人可以解释一下吗?我应该在访问前检查 isfile(dbpath) 吗?
#include <string>
using namespace std;
int main()
{
string s; // no warning
int i; // warning C4101
return 0;
}
Run Code Online (Sandbox Code Playgroud)
i但s示例中没有?我的警告级别设置为4.
我在 Windows 7 上有一个命令行应用程序。它主要由一个无限循环组成。当我单击命令行控制台窗口的关闭按钮时,它似乎立即被杀死。但是,我在析构函数中关闭了 SQLite 数据库连接,因此我担心数据库可能会损坏。即使没有,我也希望能够正确终止我的对象(也许通过向文件写入内容、记录日志等)。
我可以以某种方式确保调用我的析构函数吗?如果我关闭窗口到底会发生什么?有没有一种“更软”的方式来关闭程序?
有人建议在 SQLite 中使用参数绑定来加速重复查询。但是,如果我有多个用于绑定的参数,则它不起作用。我没有看到我的错误。所有 SQLite 函数都返回 SQLITE_OK...
下面,我写了一个最小的例子。它创建一个表,创建三个条目,然后查询两次,一次使用一个绑定参数,一次使用两个。第一次返回一个结果,这是正确的。第二个返回零结果,而 sqlite3_step() 返回 101 (SQLITE_DONE)。为什么它也不返回一个结果?
#include <vector>
#include <sqlite3.h>
int main(int argc, char * argv[])
{
sqlite3 * pDB;
int iReturn = sqlite3_open("./Test.db", &pDB);
if (iReturn != SQLITE_OK) {
return 1;
}
// create table
{
std::string str = "CREATE TABLE Names(ID INTEGER PRIMARY KEY, Name VARCHAR(30))";
iReturn = sqlite3_exec(pDB, str.c_str(), NULL, NULL, NULL);
if (iReturn != SQLITE_OK) {
sqlite3_close(pDB);
return 1;
}
}
// insert data using binding
{
std::string str = "INSERT …Run Code Online (Sandbox Code Playgroud) 我想以简单的方式编写基于索引的 for 循环。由于我的代码必须在 32 位和 64 位中运行,因此我收到很多有关隐式转换的警告,因为我通常使用 32 位整数,但 STL 在 64 位中使用 64 位整数。
std::vector<MyClass> c;
for (FOO ui = 0, uiEnd = c.size(); ui < uiEnd; ++ui){...}
Run Code Online (Sandbox Code Playgroud)
FOO = unsigned int在 32 位上工作,但在 64 位上生成警告。FOO = size_t适用于 32 和 64 位,但并不完全正确,因为标准不要求std::vector<MyClass>::size_type == size_t.FOO = auto不起作用(这是非常不幸的),因为它单独设置每个变量的类型,因此文字 0 (或 0UL 或其他)的类型不同于 c.size() (在 32 位或 64 位中, c.size() 可能不同,所以我无法写出正确的文字)。for (auto uiEnd = c.size(), ui = 0*uiEnd; ui < uiEnd; ++ui){...}其工作原理是用正确的类型表达 0,但比较晦涩。 …我想std::string在我的头文件中提供一些使用的内联便利函数以及使用的库函数const char *,但我不想包含<string>. #ifdef如果<string>是这种情况,我想检查是否包含并提供便利功能。
问题:对于所有 STL 实现,STL 标头中标头保护的名称是否相同?在 Visual Studio 2010 中,头文件保护<string>是_STRING_.
我了解到,您不能一起使用由不同编译器编译的共享库,因为它们的 ABI 通常不兼容。当然例外的是如果你有一个纯C 接口,那么这是可能的。但是,我在这方面没有找到关于静态库的明确说明,因此提出这个问题。
我的问题是静态库是否有同样的问题。如果我的共享库链接到来自不同编译器的静态库,它会在运行时按预期进行编译和工作吗?或者它会编译并表现得很糟糕吗?或者它永远不会编译?
C++03 标准是否允许将 a 附加std::vector到自身?v我想知道如果需要重新分配内存,源迭代器是否会变得无效。在我的 STL 实现中,旧内存会一直保留,直到创建新内存为止。但我可以依靠这个吗?如果不是,v.reserve(2 * v.size())在插入之前是否是完全避免重新分配的良好解决方案?
vector<int> v;
v.reserve(3);
v.push_back(1);
v.push_back(2);
v.push_back(3);
// v may need to reallocate because its capacity may be less than 6.
// Is this operation safe?
v.insert(v.end(), v.cbegin(), v.cend());
Run Code Online (Sandbox Code Playgroud)
或者
// Here v will _not_ need to reallocate because it has enough capacity.
// Is this operation safe?
v.reserve(2 * v.size());
v.insert(v.end(), v.cbegin(), v.cend());
Run Code Online (Sandbox Code Playgroud)