小编cof*_*fee的帖子

std :: ofstream :: write添加了字符

我正在尝试使用std::ofstream::write方法编写二进制文件.我发现,有些字符不是按原样写的,例如:

std::ofstream in("testout");
int i =10;

in.write((const char *)(&i), sizeof(i));
in.close();

return 0;
Run Code Online (Sandbox Code Playgroud)

将以下内容写入二进制文件:0d 0a 00 00 00 为什么会出现其他0d字节?

c++ ofstream

8
推荐指数
2
解决办法
2332
查看次数

Qt5 QWaitCondition示例

我对自己熟悉QT5并发库.我正在查看QWaitCondition示例(http://qt-project.org/doc/qt-5.0/qtcore/qwaitcondition.html#details).
这里,一个线程(线程B)读取用户输入,所有其他线程(线程A)处理此输入.

线程A:

forever {
    mutex.lock();
    keyPressed.wait(&mutex);
    ++count;
    mutex.unlock();

    do_something();

    mutex.lock();
    --count;
    mutex.unlock();
}
Run Code Online (Sandbox Code Playgroud)

线程B:

forever {
    getchar();

    mutex.lock();
    // Sleep until there are no busy worker threads
    while (count > 0) {
        mutex.unlock();
        sleep(1);
        mutex.lock();
    }
    keyPressed.wakeAll();
    mutex.unlock();
}
Run Code Online (Sandbox Code Playgroud)

使用count变量和扩展互斥同步的原因是为了防止符号丢失.
问题是,我认为符号仍有可能丢失:想象下面的场景:

  1. 线程A处理符号,并减少反对(--count); 互斥体被释放; 然后线程A停止

  2. 线程B从睡眠状态返回,获取互斥锁,查看该计数== 0,并调用keyPressed.wakeAll(),然后解锁互斥锁.但是,wakeAll()调用无处可去,因为线程A没有等待.

  3. 线程A再次启动,对互斥体进行aquaires并进入wait().由于wakeAll()已被调用,因此符号丢失.

我是对的,还是我错过了什么?如果我是对的,如何纠正这个例子以真正阻止它跳过符号?

c++ qt multithreading

6
推荐指数
1
解决办法
7780
查看次数

std::vector::assign - 重新分配数据?

我正在使用 STL 库,我的目标是尽量减少数据重新分配的情况。我想知道,是吗

std::vector::assign(size_type n, const value_type& val)

如果大小未更改或实际上只是分配新值(例如,使用operator=),则重新分配数据?

http://www.cplusplus.com/上的 STL 文档说明如下 (C++98):

在填充版本 (2) 中,新内容是 n 个元素,每个元素都初始化为 val 的副本。如果发生重新分配,则使用内部分配器来分配所需的存储。

调用之前容器中保存的任何元素都将被销毁并替换为新构造的元素(不会发生元素分配)。当且仅当新向量大小超过当前向量容量时,这会导致已分配存储空间的自动重新分配。

“没有发生元素分配”这句话让一切变得有点混乱。

例如,我想要一个类向量(例如 OpenCV 的 cv::Vec3i)。这是否意味着

  1. cv::Vec3i 的析构函数或构造函数将被调用?
  2. 将直接复制 Vec3i 内存并填充向量?
  3. 如果我的类在运行时使用new 运算符分配内存,会发生什么?该内存不能通过普通内存复制来解释。这是否意味着 allocate() 不应该用于此类对象?

编辑:在这种情况下使用 allocate 的全部目的是将向量中的所有值设置为 0 (如果我有 std::vector< cv::Vec3i > v)。它将进行很多很多次。std::vector 本身的大小不会改变。

我想做的(以更简短的方式)如下:

 for(int i=0; i<v.size(); i++)  
   for(int j=0; j<3; j++)
     v[i][j] = 0;
Run Code Online (Sandbox Code Playgroud)

现在我对C++98感兴趣

c++ stl vector

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

std :: unordered_map :: operator [] - 为什么有两个签名?

在C++ 11中,有两个版本的std :: unordered_map :: operator [],即:

mapped_type& operator[] ( const key_type& k ); //1
mapped_type& operator[] ( key_type&& k ); //2
Run Code Online (Sandbox Code Playgroud)

有两个问题:

1)为什么第二个是必要的 - 第一个允许将常量传递给函数,因为第一个包含关键字const

2)例如,在这种情况下将调用哪个版本1或2:

std::unordered_map<std::string, int> testmap;
testmap["test"] = 1;
Run Code Online (Sandbox Code Playgroud)

c++ unordered-map rvalue-reference c++11

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

Python文件变量 - 它是什么?

我刚开始使用Python,由于我的背景是更低级的语言(java,C++),我真的无法得到一些东西.

因此,在python中,例如,可以通过打开文本文件来创建文件变量,然后迭代它的行,如下所示:

f = open(sys.argv[1])
for line in f:
    #do something
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试f[0]解释器给出错误.那么f对象具有什么样的结构for ... in ... :?如果我可以将循环应用于对象,我通常如何知道?

python for-loop file

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