小编tjw*_*992的帖子

在C++ STL中访问deque元素的最佳方法是什么

我有一个双子座:

deque<char> My_Deque;
My_Path.push_front('a');
My_Path.push_front('b');
My_Path.push_front('c');
My_Path.push_front('d');
My_Path.push_front('e');
Run Code Online (Sandbox Code Playgroud)

有这样的方法输出它.

首先:

deque<char>::iterator It;
for ( It = My_Deque.begin(); It != My_Deque.end(); It++ )
    cout << *It <<  " ";
Run Code Online (Sandbox Code Playgroud)

第二:

for (i=0;i<My_Deque.size();i++) {
    cout << My_Deque[i] <<  " ";
}
Run Code Online (Sandbox Code Playgroud)

什么是访问双端队列的元素的最佳途径-通过迭代器或类似这样的:My_Deque[i]?deque <...>元素是一个指向每个元素的指针数组,用于快速访问它的数据,或者以连续的方式提供对它的随机元素的访问(如下图所示)? 在此输入图像描述

c++ stl deque

4
推荐指数
2
解决办法
1万
查看次数

如何获取要在Tkx标签中使用的字符串的"宽度"

我正在使用Perl Tkx创建一个简单的应用程序,并允许用户选择一个目录.而不是使用文本包装或将框拉伸到荒谬的长度来显示整个目录名称,如果名称太长,我想截断它并将"..."追加到最后.

问题是标签的宽度被定义为某个任意值(如40).如果这个值是标签可以容纳多少个字符的度量,我可以将字符串截断为37并附加"...",但似乎并非如此.

有谁知道-width使用Perl Tkx的标签实际上是什么?我怎样才能找到-width我的字符串占用的单位数量,这样我就可以找出适当的点来截断它的位置?


编辑:

我在tcl手册中找到了这个答案:

数据库类:宽度指定标签的所需宽度.如果标签中正在显示图像或位图,则该值以屏幕为单位(即Tk_GetPixels可接受的任何形式); 对于文本,它是字符.

如果未指定此选项,则标签的所需宽度将根据图像或位图或其中显示的文本的大小计算.

这应该意味着对于40的宽度来截断文本我应该只需要将字符串截断为37个字符并添加"...".

我通过用所有"M"填充标签来测试这一点.我使用字母"M",因为它通常是最宽的字符(见这里).我编写的代码截断为37"M"并在末尾添加"...",但"M"似乎在大约24"M"之后溢出标签的末尾.

这意味着假设它只是拉伸标签以适应最宽的角色40这是不安全的...因此我的问题仍然没有答案.

如何确定字符串的"宽度",以便我可以适当地截断它?


EDIT2:

我找到了一个解决方法,但它仍然不是我想要的解决方案.如果将标签上的文本更改为固定宽度字体,它将正常工作.它看起来不太好看,所以我真的很喜欢适用于非固定宽度字体的解决方案.

string perl user-interface truncate tkx

4
推荐指数
1
解决办法
548
查看次数

在Perl中本地更改类的属性

我在我的一个Perl脚本中遇到了一个奇怪的问题.我有一个Perl对象.在某个范围内,我希望更改其中一个对象属性,但我希望在该属性离开范围后将其恢复为旧值.

例:

my $object = Object->new('name' => 'Bob');
{
     # I know this doesn't work, but it is the best way
     # I can represent what I amd trying to do.
     local $object->name('Lenny');

     # Prints "Lenny"
     print $object->name();
}

# Prints "Bob"
print $object->name();
Run Code Online (Sandbox Code Playgroud)

有没有办法实现这样的事情?

oop perl scope lexical-scope

4
推荐指数
1
解决办法
192
查看次数

Python文档等效于Perl的"perldoc"

快速perldoc概述:

编写Perl模块时,您可以使用POD样式文档对其进行记录.然后,要了解模块的工作原理,您只需在命令行中输入:

perldoc <module_name>


我如何用Python做到这一点?

我知道Python有一种使用"docstrings"记录代码的标准形式,它有点类似于Perl的POD风格.然后可以使用该help()函数提取有关Python模块的信息,但这远非优雅.

首先,您需要启动Python解释器,然后导入您想要获得帮助的模块,最后您可以使用该help()函数获取有关模块的信息.

例:

>python
# Prints Python version info
>>>import <module_name>
>>>help(<module_name>)
# Prints documentation!
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

我想要一个Python相当于Perl的工作方式:

pydoc <module_name>

但是当我尝试这个时,我得到以下输出:

'pydoc' is not recognized as an internal or external command,
operable program or batch file.
Run Code Online (Sandbox Code Playgroud)

python documentation pydoc

4
推荐指数
1
解决办法
1273
查看次数

将999年之前的时间转换为时代

在Perl中,一个名为timelocalexists 的函数将时间转换为纪元.

例: my $epoch = timelocal($sec, $min, $hour, $mday, $mon, $year)

然而,在处理过去很久(999年之前)的时间时,这个功能似乎存在固有的缺陷 - 请参阅年度价值解释部分.更糟糕的是,它处理2位数的方式使事情变得更加复杂......

给定999年之前的时间,我如何准确地将其转换为相应的纪元值?

perl time epoch

4
推荐指数
1
解决办法
220
查看次数

Perl"反向逗号运算符"(例如,编程Perl,第4版)

我正在阅读" 编程Perl "并遇到一个似乎没有意义的奇怪例子.本书描述了Perl中的逗号运算符如何在标量上下文中使用时仅返回最后的结果.

例:

# After this statement, $stuff = "three"
$stuff = ("one", "two", "three");
Run Code Online (Sandbox Code Playgroud)

然后,这本书在几页之后给出了这个"反向逗号运算符"的例子(第82页)

# A "reverse comma operator".
return (pop(@foo), pop(@foo))[0];
Run Code Online (Sandbox Code Playgroud)

然而对我来说,这似乎并没有反过来......?

例:

# After this statement, $stuff = "three"
$stuff = reverse_comma("one", "two", "three");

# Implementation of the "reverse comma operator"
sub reverse_comma {
    return (pop(@_), pop(@_))[0];
}
Run Code Online (Sandbox Code Playgroud)

这与正常的逗号运算符有何不同?结果是一样的,没有逆转!

这是指向确切页面的链接.这个例子靠近底部.

perl operators comma scalar-context

4
推荐指数
2
解决办法
362
查看次数

为什么这个递归正则表达式不捕获整个代码块?

我正在尝试编写一个递归正则表达式来捕获代码块,但由于某种原因它似乎没有正确捕获它们.我希望下面的代码能够捕获函数的完整主体,但它只捕获第一个if语句的内容.

它几乎就像.+?是以某种方式吞噬了第一个{,但它应该是非贪婪的,所以我不明白它为什么会这样.

是什么导致它以这种方式行事?

脚本:

use strict;
use warnings;

my $text = << "END";
int max(int x, int y)
{
    if (x > y)
    {
        return x;
    }
    else
    {
        return y;
    }
}
END

# Regular expression to capture balanced "{}" groups
my $regex = qr/
    \{              # Match opening brace
        (?:         # Start non-capturing group
            [^{}]++ #     Match non-brace characters without backtracking
            |       #     or
            (?R)    #     Recursively match the entire expression
        )* …
Run Code Online (Sandbox Code Playgroud)

regex perl regex-recursion

4
推荐指数
1
解决办法
134
查看次数

Perl中变量名中的单引号?

我在 vim 中编写了一些 Perl 代码,不小心在变量名中输入了一个单引号字符,并注意到它以与普通单引号字符串不同的颜色突出显示它。

在此处输入图片说明

我觉得这很奇怪,所以我写了一个小测试程序(如上所示)并尝试运行它以查看 Perl 将如何处理它,但我收到了这个错误:

"my" variable $var::with::apostrophes can't be in a package

这里到底发生了什么?是否存在变量名称中的单引号实际上有效的情况?如果是这样,单引号在这种情况下使用时有什么含义?

perl variable-names single-quotes

4
推荐指数
1
解决办法
88
查看次数

Perl分裂并弹出一行

我正在尝试拆分一个字符串并从返回的数组中弹出一个值.我怎么能在一行中做到这一点?

my $string = 'test,string';

# Split and pop in one line
my $val = pop [split ',', $string];

print $val;
Run Code Online (Sandbox Code Playgroud)

结果应该是,'string'但我得到这个:

弹出的arg 1的类型必须是数组(不是匿名列表([]))


这是我的Perl版本信息,以防它有用:

这是为x86_64-linux-thread-multi构建的perl,v5.8.8

syntax perl split

3
推荐指数
2
解决办法
1363
查看次数

分配和后递增循环迭代器时的C++无限循环(gcc bug?)

前几天我在我们的一个C++应用程序中遇到了一个奇怪的拼写错误,触发了代码进入无限循环.在for循环结束时i++,程序员意外地分配,而不是仅仅递增i = i++.

for (int i = 0; i < 10; i = i++) {
    cout << "i = " << i << endl;
}
Run Code Online (Sandbox Code Playgroud)

输出:

i = 0
i = 0
i = 0
...
Run Code Online (Sandbox Code Playgroud)

最奇怪的是,即使理解这是一个错字,我也看不出为什么这段代码不起作用.据我所知,分配i应该没有影响,因为i在分配后仍应增加.(出于某种原因,它必须改为复制一份?但这似乎没有意义.)

另一个有趣的事情是将赋值更改为i = ++i不会产生无限循环.

这段代码在我们之前的编译器中没有产生无限循环:gcc version 4.4.7 20120313.我们最近升级到gcc version 4.8.5 20150623现在它.

问题是为什么这个代码在逻辑上看起来不应该产生无限循环,哪个编译器根据C++标准正确解释这个?

c++ gcc for-loop variable-assignment post-increment

3
推荐指数
1
解决办法
100
查看次数