小编gsi*_*011的帖子

每次为Iterables调用for循环的"条件"吗?

可以说我有以下代码:

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)

java for-loop iterable conditional-statements

5
推荐指数
1
解决办法
157
查看次数

使用lower_bound,upper_bound和binary_search查找具有相等成员字段的对象

我有一个看起来像这样的结构

struct Foo {
    int a;
};
Run Code Online (Sandbox Code Playgroud)

我有这些结构的向量,看起来像这样,

vector<Foo> foos;
Run Code Online (Sandbox Code Playgroud)

使用STL sort()函数,所有Foos都按整数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未被定义或是任意的,并且该构造函数可以在码)。但是,如果这是唯一的选择,我会接受。

c++ search stl

5
推荐指数
1
解决办法
5556
查看次数

对象的默认比较运算符是什么?

我在代码中发现了一个错误,我在排序结构容器时忘记使用自定义比较器.这让我想知道它作为小于运算符使用了什么,因为我没有为结构定义任何东西.

当没有定义那些运算符时,对象如何比较<,>和==?是内存地址吗?它是在标准中定义的吗?我在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)

c++ comparison comparison-operators

5
推荐指数
1
解决办法
8969
查看次数

为什么WebView比TextView快得多

我有一个应该显示文本文件的活动.文本文件是165 kB.最初,在我阅读文本文件后,我会做这样的事情,

textView.setText(fileText);
Run Code Online (Sandbox Code Playgroud)

但是我的Nexus 4上花了10秒钟,我确认这是因为调用setText()而不是读取文件.然后,在搜索了一下之后,我想到了将它放在webview中,使用WebView.loadData().这需要不到一秒钟.

我很好奇为什么WebView能够比TextView更快地加载文本.有人知道吗?

performance android textview webview

5
推荐指数
1
解决办法
952
查看次数

程序不输入if语句

在我的python程序中,没有输入if语句.我已将代码简化为以下内容:

x = -5
while x < 5:
    if (x == 0):
        print 0
    x += .01
Run Code Online (Sandbox Code Playgroud)

该程序不输出任何内容.

但是,将最后一行更改为x + = .5会使程序输出0.问题是什么?

python floating-point

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

让线程暂停 - Thread.wait()/ Thread.notify()

我试图理解线程如何工作,我写了一个简单的例子,我想创建并启动一个新线程,线程,在主线程中显示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)

java multithreading synchronization

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

注释的处理在哪里发生?

我最近一直在阅读关于注释的内容,我有点困惑.我已经使用了注释@NotNull,但我真的不知道它是如何检查变量是否为空.没有在代码中的任何位置我看到任何检查null的值.这是有道理的,因为它是一个接口,所以实际处理在哪里发生,为什么不在代码中指定这个位置?我见过的例子通常只是制作一个带有值的注释,但是没有做任何事情,所以我对实现的位置感到困惑.

java annotations notnull

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

"只有当初始化与声明结合时才"跨越变量的初始化"

我已经阅读了关于"跳转到案例标签"错误的这个问题,但我仍然有一些问题.我在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循环中,那么每次输入和离开范围时都不会调用构造函数和析构函数,从而导致效率降低?或者编译器会优化它吗?

c++ performance g++ switch-statement

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

为什么这些C结构定义会发出警告和错误?

为什么这两个结构定义编译正常:

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.

c gcc struct

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

如何在词法分析器中有效地实现最长匹配?

我有兴趣学习如何编写像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

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