小编MSa*_*ers的帖子

从STL std :: queue中删除而不破坏已删除的对象?

我可以在STL容器(队列和列表)上找到的所有文档都说,对于任何remove函数,都会调用被删除对象的析构函数.这意味着每当我想要一个只需要对它们执行某些操作的对象列表的队列时,我就不能使用std :: queue.

我希望能够在排队让我对他们做某事时将对象添加到队列中.然后我想在完成它们之后将它们从它上移除,而不会破坏有问题的物体.从我读过的文档中看似不可能.我误读了文档吗?除了在调用pop_front时没有调用被删除对象的析构函数的基本"队列"之外,STL中是否存在另一种类型的队列?

编辑澄清:在我的情况下,我正在使用指针列表.像这样的东西:

   dbObject *someObject;
   queue<dbObject *> inputQueue;
   inputQueue.push_back(someObject);

   ...

   dbObject *objectWithInput = inputQueue.front();
   //handle object's input...
   inputQueue.pop_front(); // Remove from queue... destroyed now?
Run Code Online (Sandbox Code Playgroud)

c++ queue stl

7
推荐指数
2
解决办法
8004
查看次数

C++ Boost:在大多数Linux发行版中默认包含它吗?

在大多数Linux发行版中,默认情况下是否包含C++ Boost库?

c++ linux boost

7
推荐指数
1
解决办法
356
查看次数

C++:如何防止模板专门化指针?

我开始道歉,如果我是愚蠢的,如果它是如此明显,找不到答案.

我已经看过几十页讨论指针参数的特定模板专业化.

但是,我希望能够防止模板专门化指针参数,但我无法弄清楚如何做到这一点.

template< class T >
void function( T arg )
{
  //...
}

int main( )
{
    int i = 42;

    function( i );    // Ok
    function( &i );   // Die bastart with a compiler error!
}
Run Code Online (Sandbox Code Playgroud)

可能吗?

谢谢.

c++ templates pointers

7
推荐指数
3
解决办法
1804
查看次数

多线程:我是否需要以只读方法保护我的变量?

关于使用lock来保护我的共享数据结构,我几乎没有问题.我正在使用C/C++/ObjC/Objc ++

例如,我有一个在多线程环境中使用的计数器类

class MyCounter {
private:
    int counter;
    std::mutex m;

public:
    int getCount() const {
        return counter;
    }
    void increase() {
        std::lock_guard<std::mutex> lk(m);
        counter++;
    }
};
Run Code Online (Sandbox Code Playgroud)
  1. 我是否需要std::lock_guard<std::mutex> lk(m);getCount()方法中使用它来使其线程安全?

  2. 如果只有两个线程会发生什么:读者线程和编写器线程然后我必须保护它吗?因为只有一个线程正在修改变量所以我认为不会发生丢失更新.

  3. 如果共享原始类型变量有多个int编写器/阅读器(例如)如果我只锁定写入方法而不是读取方法,可能会发生什么样的灾难?与64位类型相比,8bits类型会有什么不同吗?

  4. 原始类型是默认的原子吗?例如,写入a char始终是原子的?(我知道这在Java中是正确的,但我不知道c ++,如果平台很重要,我在Mac上使用llvm编译器)

c++ concurrency multithreading locking c++11

7
推荐指数
1
解决办法
3194
查看次数

根据需要阅读,如何从在线大文件中读取前256个字节而无需下载?

我需要从映射的WebDAV驱动器中读取大文件中的前256 B.

我打开文件

h_second = CreateFileA(second_server, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
Run Code Online (Sandbox Code Playgroud)

但它首先下载整个文件,之后我可以阅读它.我想要的东西,只下载文件的一小部分,我读了.

谁能帮我?

c file-io winapi webdav

7
推荐指数
1
解决办法
261
查看次数

如何在Gnu C++(g ++)中使用十进制浮点?

GCC 4.5在运行时库中增加了对十进制浮点的支持(http://gcc.gnu.org/gcc-4.5/changes.html).我能够编译代码,包括使用命名空间std :: decimal,然后在代码中使用decimal64等.

不幸的是,我缺少一些用于链接代码的库.我无法找出应该要求哪些库.已在gcc中启用DFP支持(--enable-decimal-float = dpd)

另外,是否应该有一些快速的方法在代码中提供十进制文字?快速,我的意思是用户定义的文字,由模板处理并在编译时翻译.我不想提供在运行时转换的双精度数(尽管性能和事实上我真的无法将评估从编译时间转移到运行时仍存在舍入问题......).我已经找到了后缀"df",但编译器似乎没有认识到这一点.

我在目标powerpc-ibm-aix7.1.0.0上使用gcc版本4.7.1.

链接器错误消息:

ld: 0711-317 ERROR: Undefined symbol: .__dpd_floatsisd
ld: 0711-317 ERROR: Undefined symbol: .__dpd_floatsidd
ld: 0711-317 ERROR: Undefined symbol: .__dpd_floatsitd
ld: 0711-317 ERROR: Undefined symbol: .__dpd_mulsd3
ld: 0711-317 ERROR: Undefined symbol: .__dpd_muldd3
ld: 0711-317 ERROR: Undefined symbol: .__dpd_multd3
ld: 0711-317 ERROR: Undefined symbol: .__dpd_floatdisd
ld: 0711-317 ERROR: Undefined symbol: .__dpd_floatunsdisd
ld: 0711-317 ERROR: Undefined symbol: .__dpd_floatdidd
ld: 0711-317 ERROR: Undefined symbol: .__dpd_floatunsdidd
ld: 0711-317 ERROR: Undefined symbol: .__dpd_floatditd
ld: 0711-317 ERROR: Undefined …
Run Code Online (Sandbox Code Playgroud)

c++ gcc powerpc decimal

7
推荐指数
1
解决办法
1428
查看次数

与创建委托相比,关键字委托如何工作

我正慢慢地围绕代表,因为委托的签名必须与它委派的方法相匹配.

但是,请查看以下代码.

public static void Save()
{
    ThreadStart threadStart = delegate
    {
        SaveToDatabase();
    };
    new Thread(threadStart).Start();
}

private static void SaveToDatabase() { }
Run Code Online (Sandbox Code Playgroud)

我现在感到难过,因为代表返回void(因为那是什么SaveToDatabase())但是,它显然正在返回ThreadStart......或者是它?

如果我要编写自己的委托,我不知道如何实现这一点,因为委托必须是无效的,以匹配返回类型SaveToDatabase().但它不可能; 它会是类型ThreadStart!

我的问题是,我是完全误解了还是通过一些.NET技巧使这成为可能?如果我想写这个方法但是创建我自己的委托,我该怎么办?

c# delegates

7
推荐指数
2
解决办法
270
查看次数

第三个参数std :: accumulate的充分理由?

我刚刚写了一个小帮手函数作为包装std::accumulate:

template <typename FwdIter> inline
auto accumulate(FwdIter begin, FwdIter end) -> std::iterator_traits<FwdIter>::value_type
{
    return std::accumulate(begin, end, std::iterator_traits<FwdIter>::value_type());
}
Run Code Online (Sandbox Code Playgroud)

我可能在这里忽略了一些东西.为什么这不是现有的超载std::accumulate?功能显得如此明显,以至于不容忽视; 有人有充分理由强制要求第三个参数.

(另请参阅了解std :: accumulate - 我理解为什么你希望能够提供初始值,我只是不明白为什么它是强制性的)

c++ c++11

7
推荐指数
1
解决办法
436
查看次数

Python:为什么不(a,b,c)=(*x,3)

显然我不能用Python(2.7)做到这一点:

x = (1, 2,)
(a, b, c) = (*x, 3)
Run Code Online (Sandbox Code Playgroud)

它在我的头脑中是有道理的,但是......我可以创建一个函数:

make_tuple = lambda *elements: tuple(elements)
Run Code Online (Sandbox Code Playgroud)

那我就能做到

(c, a, b) = make_tuple(3, *x)
Run Code Online (Sandbox Code Playgroud)

但不是,例如

(a, b, c) = make_tuple(*x, 3)
(a, b, c, d) = make_tuple(*x, *x)
y = [3, 4]
(a, b, c, d) = (*x, *y,)
Run Code Online (Sandbox Code Playgroud)

所以我要问的是

  1. 是不是有理由不允许这个?(第一件事)
  2. 什么是最接近的工作?

我目前对#2的猜测:

(a, b, c) = x + (3,)
(a, b, c, d) = x + x
(a, b, c, d) = x + tuple(y)
Run Code Online (Sandbox Code Playgroud)

python

7
推荐指数
1
解决办法
683
查看次数

在for循环中重新排序测试条件:编译器错误?

我有一个存储在数组中的树,我正在尝试找到一个特定的节点:

std::vector<Node> nodes = ...
const unsigned short sentinel = -1;
unsigned short index = 0;
for (Node* node = &nodes[index]; // root node
     index != sentinel;
     node = &nodes[index])
{
    if (foo(*node)) {
       index = node->left;
    } else {
       index = node->right;
    }
}
Run Code Online (Sandbox Code Playgroud)

换句话说,没什么特别的.但是,MSVC 2012失败,尝试访问nodes[sentinel]超出范围.事实证明它首先计算&nodes[index],然后测试index.(调试模式,无优化).

对我来说,这看起来像代码生成错误,但我至少在十年内没有看到过这样的错误.这是简单的未经优化的代码.当然,即使重新排列,nodeindex测试之前实际上并没有被使用,并且在x86上拥有这样的越界指针并不是非常不安全,但是MSVC vector<>在该非法索引上是合理的断言.

干净的构造并再次检查组件; 它是可重复的.树也不是空的,总是有一个根节点.

我忽略了什么,或者这真的是一个严重的编译器错误?

c++ visual-c++

7
推荐指数
2
解决办法
222
查看次数