Boost或其他任何包含容器的东西是否会像共享指针一样,但允许我控制共享"资源"在其生命周期结束时会发生什么?我想封装一个可以传递的对象,但是当不再需要时可以以上下文定义的方式关闭它.
例如,我可能想要创建并传递一个文件句柄,知道当它超出范围时,文件将自动关闭,但我不想删除句柄.
我可以自己实现它,但如果框架已经存在,我宁愿不进入它 - 有人毫无疑问做得更好.我不能使用boost::shared_ptr
,至少不能使用它的正常形式,因为资源不应该在生命结束时被删除.
我很好奇以下代码背后的基本原理.对于给定的地图,我可以end()
使用以下代码删除最多但不包括(显然)的范围:
map<string, int> myMap;
myMap["one"] = 1;
myMap["two"] = 2;
myMap["three"] = 3;
map<string, int>::iterator it = myMap.find("two");
myMap.erase( it, myMap.end() );
Run Code Online (Sandbox Code Playgroud)
这将使用范围删除最后两个项目.但是,如果我使用了擦除的单个迭代器版本,我一半期望传递myMap.end()
到没有动作,因为迭代器显然在集合的末尾.这与腐败或无效的迭代器不同,后者显然会导致未定义的行为.
但是,当我这样做时:
myMap.erase( myMap.end() );
Run Code Online (Sandbox Code Playgroud)
我只是得到一个分段错误.我不会认为map很难检查迭代器是否等于end()
并且在这种情况下不采取行动.这是否有一些微妙的原因让我失踪?我注意到即便如此:
myMap.erase( myMap.end(), myMap.end() );
Run Code Online (Sandbox Code Playgroud)
(即什么都不做)
我问的原因是我有一些代码接收到集合的有效迭代器(但可能是end()
),我想简单地将其传递给擦除而不是像这样先检查:
if ( it != myMap.end() )
myMap.erase( it );
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎有点笨拙.另一种方法是重新编码,这样我就可以使用按键式擦除重载,但如果我能帮助它,我宁愿不重写太多.
请把我从痛苦中解脱出来.以下示例似乎使用了y
两次而不是y
然后m
.
>>> m=8
>>> y=11
>>> print '20{0:02d}{0:02d}01'.format(y, m)
20111101
Run Code Online (Sandbox Code Playgroud)
我已经尽可能多地完成了文档,但无法弄清楚旧程序会有什么相对简单的方法:
>>> print '20%02d%02d01' % ( y, m )
20110801
Run Code Online (Sandbox Code Playgroud)
如果有人能解释我哪里出错了,我会非常感激.
我知道您可以使用如下查询连接单个表中的多个列:
SELECT ( column1 || column2 || column3 || ... ) AS some_name FROM some_table
Run Code Online (Sandbox Code Playgroud)
是否有可能来连接列从多个表使用单一的SQLite查询?
非常简单的例子 - 两个表和结果:
Table1 | Table2 | Result
Col1 Col2 | Col3 |
-------------------------------------------------------------------------------
A B | C | ABC
Run Code Online (Sandbox Code Playgroud)
如果这是可能的,查询将是什么?
我总是可以手动连接多个单表串联结果,但有sqlite做所有的工作会很棒:)
任何人都可以对以下功能的观点发表评论,这似乎并不是很多:
// Returns stored values
int getDetails(const int param1[],
int* param2,
int* param3,
int* param4)
{
(void)param1;
(void)param2;
(void)param3;
(void)param4;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
评论实际上是代码.我认为它必须是某种奇怪的存根,但它被调用,我绞尽脑汁试图想象我所缺少的东西.
到目前为止,我最好的预感是该函数已被弃用但未被删除,这(void)param
是为了避免编译器警告有关未使用的变量.
我在 YAML 文件中有一个变量的定义、它的名称和相关的注释,我正在尝试使用 Jinja2 创建一个合适的目标文件;在这种情况下,一个专有的配置文件
...
- comment: >
This is a comment which will almost certainly end up longer than standard eighty characters or at least on the occasion on which it does.
name: my_useful_variable
value: /a/long/example/path/to/my/file.txt
Run Code Online (Sandbox Code Playgroud)
我希望此文本呈现如下:
# This is a comment which will almost certainly end up
# longer than standard eighty characters or at least on
# the occasion on which it does.
my_useful_variable = "/a/long/example/path/to/my/file.txt"
Run Code Online (Sandbox Code Playgroud)
Jinja2 是否有任何包装文本的方法,以便长注释行的长度受到限制,并且需要拆分成多行?
到目前为止,我有:
# {{item.comment}}
{{item.name}} = "{{item.value}}"
Run Code Online (Sandbox Code Playgroud)
但这当然不涉及评论的长度。
解决方案 …
非常简单的问题,希望如此.因此,在Python中,您可以使用索引拆分字符串,如下所示:
>>> a="abcdefg"
>>> print a[2:4]
cd
Run Code Online (Sandbox Code Playgroud)
但如果指数基于变量,你如何做到这一点?例如
>>> j=2
>>> h=4
>>> print a[j,h]
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: string indices must be integers
Run Code Online (Sandbox Code Playgroud) 我有一个日志文件,其中一些条目如下所示:
YY/MM/DD HH:MM:SS:MMM <Some constant text> v1=XXX v2=YYY v3=ZZZ v4=AAA AND BBB v5=CCC
Run Code Online (Sandbox Code Playgroud)
我正试图将其变成CSV格式:
Date,Time,v1,v2,v3,v4,v5
YY/MM/DD,HH:MM:SS:MMM,XXX,YYY,ZZZ,AAA AND BBB,CCC
Run Code Online (Sandbox Code Playgroud)
我想在Perl中这样做 - 亲自说话,我可能在其他语言中做得更快,但我真的想扩大我的视野.
到目前为止,我可以阅读文件,只选择符合我标准的行,但我似乎无法完成下一阶段的工作.我需要拼接输入线,但到目前为止我还是无法解决如何做到这一点.我看s//
和m//
,但他们真的不给我我想要的东西.如果有人可以告诉我如何做到这一点或给我指点,我会非常感激.
重点:
v<number>=
我希望解析这应该仍然是一种可能性.我想知道是否有人可以在没有重组的情况下提供建议来解决这种情况:我有一个包含类声明的标题,并声明了它通过引用/指针使用的一些类,这显然是很好的做法,而不仅仅是包括这些类的标题.
struct Foo;
struct Bar;
struct MyStruct
{
void doIt( const Foo* foo );
void doIt( const Bar* bar );
};
Run Code Online (Sandbox Code Playgroud)
但是,虽然在上面的示例中,Foo是一个类,但Bar实际上是一个类的typedef,如下面的粗略示例所示:
#include <fd_ex.h>
struct Foo
{
int a;
};
struct Bar_
{
int a;
};
typedef Bar_ Bar;
Run Code Online (Sandbox Code Playgroud)
这会导致一些问题,因为预定义struct Bar
显然不正确 - Bar
不是结构:
"fd_ex.cpp", line 13: Error: Multiple declaration for Bar.
"fd_ex.cpp", line 19: Error: The name Bar is ambiguous, Bar and Bar.
2 Error(s) detected.
Run Code Online (Sandbox Code Playgroud)
Bar_
如果可能的话,我不想暴露,主要是因为在现实生活中这可能比这个例子复杂得多.
但是,如果我无法控制 struct声明和typedef Bar
,是否有任何技术可以在标题中使用MyStruct
以保持预先声明的精神Bar
?
我试图将a转换std::string
为char*
(复制而不是转换),因为必须将一些数据传递给相当过时的API.
从表面上看,有很多方法可以做到这一点,但有人建议我这样做是一个看似合理的向量.但是,当我尝试这个时,结果是乱码.代码如下:
const string rawStr("My dog has no nose.");
vector<char> str(rawStr.begin(), rawStr.end());
cout << "\"" << (char*)(&str) << "\"" << endl;
Run Code Online (Sandbox Code Playgroud)
(注意令人不快的C演员 - 使用static_cast不起作用,这可能告诉我一些事情)
当我运行这个时,我得到:
"P/"
Run Code Online (Sandbox Code Playgroud)
显然不对.我看了一下gdb中的向量
(gdb) print str
$1 = std::vector of length 19, capacity 19 = {77 'M', 121 'y', 32 ' ', 100 'd', 111 'o',
103 'g', 32 ' ', 104 'h', 97 'a', 115 's', 32 ' ', 110 'n', 111 'o', 32 ' ', 110 'n',
111 'o', 115 …
Run Code Online (Sandbox Code Playgroud) 我有一个由许多唯一字符串组成的数组,如果可能的话,我想从它创建一个地图对象,其中每个元素的键是唯一字符串,并且该值默认为某个任意设置,而无需循环。
有没有一种方法可以在一行中完成此操作而无需循环?即我想从
var colours = [ "Red", "Orange", "Yellow", "Green", "Blue", "Indigo", "Violet" ];
Run Code Online (Sandbox Code Playgroud)
到
var colourMap = {
"Red": VAL,
"Orange": VAL,
"Yellow": VAL,
"Green": VAL,
"Blue": VAL,
"Indigo": VAL,
"Violet": VAL
};
Run Code Online (Sandbox Code Playgroud) 我有一系列可以通过可选地传递参数来创建的类,或者如果省略,它将使用默认数据结构.所有类都以相同的方式工作,因此:
class square(object):
_vertices = [ (0, 0), (0, 10), (10, 10), (10, 0) ]
def __init__(self, vertices=_vertices):
# more stuff ...
class triangle(object):
_vertices = [ (0, 0), (5, 10), (10, 10) ]
def __init__(self, vertices=_vertices):
# more stuff ...
# ... more classes
Run Code Online (Sandbox Code Playgroud)
我还有一个工厂函数,它接受一个字符串并创建一个合适的对象
def create_shape(key)
if key == 'square':
return square()
elif key == 'triangle':
return triangle()
Run Code Online (Sandbox Code Playgroud)
虽然很自然,但这不允许我传递顶点参数
shape1 = create_shape('square') # OK, basic creation
shape2 = create_shape('triangle', my_own_vertices) # Not OK, param 2
# can't go …
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一些Perl来将一些基于HTML的文本转换为MediaWiki格式并遇到以下问题:我想在某些文本的分隔子区域内进行搜索和替换,并想知道是否有人知道这样做的简洁方法.我的输入流类似于:
Please mail <a href="mailto:help@myco.com&Subject=Please help&Body=Please can some one help me out here">support.</a> if you want some help.
Run Code Online (Sandbox Code Playgroud)
我想改变Please help
,并Please can some one help me out here
以Please%20help
和Please%20can%20some%20one%20help%20me%20out%20here
分别,在不改变任何其他空间的就行了.
当然,我还需要能够在线上处理多个这样的链接,因此拼接不是一个很好的选择.
我已经对Perl教程网站(这不是我的第一语言)进行了很好的了解,但没有像这样的例子.任何人都可以建议一个优雅的方式吗?
c++ ×4
python ×3
string ×3
perl ×2
arrays ×1
boost ×1
c ×1
char ×1
class ×1
dictionary ×1
erase ×1
formatting ×1
header ×1
iterator ×1
javascript ×1
jinja2 ×1
long-integer ×1
map ×1
mediawiki ×1
multiline ×1
regex ×1
shared-ptr ×1
sqlite ×1
stl ×1
templates ×1
text ×1
typedef ×1
vector ×1
void ×1