可以说我有以下代码:
for (Object obj : Node.getIterable()) {
//Do something to object here
}
Run Code Online (Sandbox Code Playgroud)
和Node.getIterable()返回一个iterable.是每次调用getIterable()函数还是仅在for循环启动时调用?我应该把它改成:
Iterable<Object> iterable = new Iterable<Object>();
//populate iterable with objects
for (Object obj : iterable) {
//Do something
}
Run Code Online (Sandbox Code Playgroud) 我有一个看起来像这样的结构
struct Foo {
int a;
};
Run Code Online (Sandbox Code Playgroud)
我有这些结构的向量,看起来像这样,
vector<Foo> foos;
Run Code Online (Sandbox Code Playgroud)
使用STL sort()函数,所有Foo
s都按整数a
升序排序。现在,我想获取Foo
成员字段a
小于或等于给定数字的对象,例如STL lower_bound()函数。问题是STL lower_bound函数声明看起来像这样:
template <class ForwardIterator, class T, class Compare>
ForwardIterator lower_bound ( ForwardIterator first, ForwardIterator last,
const T& value, Compare comp );
Run Code Online (Sandbox Code Playgroud)
所以当我想做类似的事情时,
lower_bound(foos.begin(), foos.end(), 5, custom_comp);
Run Code Online (Sandbox Code Playgroud)
我不能,因为我要查找的int(在这种情况下为5)不是type Foo
。我在Lower_bound(),upper_bound()和binary_search()中遇到此问题。custom_comp仅定义顺序,而没有定义a = 5的对象实际上等于int 5。
使用STL有什么优雅的方法吗?
编辑:
我意识到我的例子并不能完全代表我的问题。我实际上拥有的是Foo包含两个整数a和b。当我调用lower_bound时,我无权访问b(因为我不在乎)。现在,billz答案的问题是,我必须定义一个仅以a
参数为参数的构造函数,在我看来,这不是很优雅(因为b未被定义或是任意的,并且该构造函数可以在码)。但是,如果这是唯一的选择,我会接受。
我在代码中发现了一个错误,我在排序结构容器时忘记使用自定义比较器.这让我想知道它作为小于运算符使用了什么,因为我没有为结构定义任何东西.
当没有定义那些运算符时,对象如何比较<,>和==?是内存地址吗?它是在标准中定义的吗?我在Google上找不到任何此类信息.
编辑:
这是我正在使用的课程:
using namespace std;
typedef unsigned id;
class LogEntry {
id master_id;
string timestamp;
string category;
string message;
string str_rep;
public:
LogEntry(id id, string t, string c, string m) :
master_id(id), timestamp(t), category(c), message(m) {
}
string get_timestamp() const {
return timestamp;
}
string get_category() const {
return category;
}
string get_message() const {
return message;
}
string to_string() {
ostringstream ss;
ss << master_id << "|" << timestamp << "|" << category << "|"
<< message; …
Run Code Online (Sandbox Code Playgroud) 我有一个应该显示文本文件的活动.文本文件是165 kB.最初,在我阅读文本文件后,我会做这样的事情,
textView.setText(fileText);
Run Code Online (Sandbox Code Playgroud)
但是我的Nexus 4上花了10秒钟,我确认这是因为调用setText()
而不是读取文件.然后,在搜索了一下之后,我想到了将它放在webview中,使用WebView.loadData()
.这需要不到一秒钟.
我很好奇为什么WebView能够比TextView更快地加载文本.有人知道吗?
在我的python程序中,没有输入if语句.我已将代码简化为以下内容:
x = -5
while x < 5:
if (x == 0):
print 0
x += .01
Run Code Online (Sandbox Code Playgroud)
该程序不输出任何内容.
但是,将最后一行更改为x + = .5会使程序输出0.问题是什么?
我试图理解线程如何工作,我写了一个简单的例子,我想创建并启动一个新线程,线程,在主线程中显示1到1000的数字,恢复辅助线程,并显示次要线程中的数字从1到1000.当我省略Thread.wait()/ Thread.notify()时,它的行为与预期一致,两个线程一次显示几个数字.当我添加这些函数时,由于某种原因,主线程的数字是第二个而不是第一个打印的.我究竟做错了什么?
public class Main {
public class ExampleThread extends Thread {
public ExampleThread() {
System.out.println("ExampleThread's name is: " + this.getName());
}
@Override
public void run() {
for(int i = 1; i < 1000; i++) {
System.out.println(Thread.currentThread().getName());
System.out.println(i);
}
}
}
public static void main(String[] args) {
new Main().go();
}
public void go() {
Thread t = new ExampleThread();
t.start();
synchronized(t) {
try {
t.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for(int i …
Run Code Online (Sandbox Code Playgroud) 我最近一直在阅读关于注释的内容,我有点困惑.我已经使用了注释@NotNull,但我真的不知道它是如何检查变量是否为空.没有在代码中的任何位置我看到任何检查null的值.这是有道理的,因为它是一个接口,所以实际处理在哪里发生,为什么不在代码中指定这个位置?我见过的例子通常只是制作一个带有值的注释,但是没有做任何事情,所以我对实现的位置感到困惑.
我已经阅读了关于"跳转到案例标签"错误的这个问题,但我仍然有一些问题.我在Ubuntu 12.04上使用g ++ 4.7.
此代码给出错误:
int main() {
int foo = 1;
switch(foo) {
case 1:
int i = 0;
i++;
break;
case 2:
i++;
break;
}
}
Run Code Online (Sandbox Code Playgroud)
错误是
jump-to-case-label.cpp: In function ‘int main()’:
jump-to-case-label.cpp:8:8: error: jump to case label [-fpermissive]
jump-to-case-label.cpp:5:9: error: crosses initialization of ‘int i’
Run Code Online (Sandbox Code Playgroud)
但是,这段代码很好,
int main() {
int foo = 1;
switch(foo) {
case 1:
int i;
i = 0;
i++;
break;
case 2:
i++;
break;
}
}
Run Code Online (Sandbox Code Playgroud)
第二个代码是否比第一个代码更危险?我很困惑为什么g ++允许它.
其次,解决此问题的方法是确定初始化变量的范围.如果初始化变量是一个大对象,并且switch语句在while循环中,那么每次输入和离开范围时都不会调用构造函数和析构函数,从而导致效率降低?或者编译器会优化它吗?
为什么这两个结构定义编译正常:
struct foo {
int a;
} __attribute__((packed));
typedef struct __attribute__((packed)) {
int a;
} bar;
Run Code Online (Sandbox Code Playgroud)
虽然这个发出警告:
typedef struct {
int a;
} baz __attribute__((packed));
warning: ‘packed’ attribute ignored [-Wattributes]
Run Code Online (Sandbox Code Playgroud)
这一个给出了错误和警告:
typedef struct qux __attribute__((packed)) {
int a;
} qux;
error: expected identifier or ‘(’ before ‘{’ token
warning: data definition has no type or storage class [enabled by default]
Run Code Online (Sandbox Code Playgroud)
作为新手C程序员,最后两个定义不起作用的事实似乎是语言设计者/编译器编写者的一个相当随意的选择.是否有一个原因?我正在使用gcc 4.7.3.
我有兴趣学习如何编写像flex这样的词法生成器.我一直在阅读"编译器:原理,技术和工具"("龙书"),我对flex的工作原理有一个基本的了解.
我最初的方法是:用户将提供正则表达式的哈希映射,将正则表达式映射到令牌枚举.程序将按照给定的顺序逐个遍历正则表达式,看看它们是否与字符串的开头匹配(我可以^
在每个正则表达式的开头添加一个来实现它).如果他们这样做,我可以将该正则表达式的令牌添加到该程序的令牌列表中.
我的第一个问题是,这是最有效的方法吗?目前我必须遍历每个正则表达式,但理论上我可以从所有正则表达式组合构建DFA并更有效地逐步执行.但是,创建此DFA会产生一些开销.
我的第二个问题是,我如何实现最长的匹配字符串连接断路器,就像flex一样?即,我想匹配ifa
作为标识符,而不是if
字母后跟的关键字a
.我没有看到任何有效的方法来使用正则表达式.我想我必须循环遍历所有正则表达式,尝试匹配它们,如果我有多个匹配项,则取最长的结果.但是,如果我将正则表达式转换为DFA(即我自己的DFA数据结构),那么我可以继续单步执行字符,直到DFA上没有可能的过渡边缘.此时,我可以将最后一次通过接受状态作为令牌的实际匹配,因为这应该是最长的匹配.
我的两个问题都指向将自己的翻译从正则表达式编写为DFA.这是必需的,还是我仍然可以使用普通正则表达式(由标准库实现)有效地执行此操作并仍然获得最长的匹配?
编辑:我保留了我正在使用的正则表达式引擎,因为我想要一个通用的答案,但我正在使用Rust的正则表达式库:http://static.rust-lang.org/doc/master/regex/index. HTML
regex language-agnostic programming-languages lexical-analysis dfa