Tag: c ++ 11

我怎样才能避免“for”循环与他们在内部的“if”条件与C + +?

几乎所有我写的代码,我经常处理集合的集合减less问题,最终最终会以它们内部天真的“if”条件结束。 这是一个简单的例子: for(int i=0; i<myCollection.size(); i++) { if (myCollection[i] == SOMETHING) { DoStuff(); } } 使用function性语言,我可以通过将收集减less到另一个收集(轻松)来解决问题,然后对缩减集执行所有操作。 在伪代码中: newCollection <- myCollection where <x=true map DoStuff newCollection 而在其他C变种,如C#,我可以减less一个where子句,如 foreach (var x in myCollection.Where(c=> c == SOMETHING)) { DoStuff(); } 或者更好(至less在我眼中) myCollection.Where(c=>c == Something).ToList().ForEach(d=> DoStuff(d)); 不可否认,我正在做很多混合范式和基于主观/意见的风格,但是我不禁觉得我错过了一些真正的基础,可以让我在C ++中使用这个首选的技术。 有人能教导我吗?

使用这个指针会导致热循环中出现奇怪的去最佳化

我最近遇到了一个奇怪的去优化(或者说错过了优化的机会)。 考虑将3位整数数组有效解包为8位整数的函数。 它在每个循环迭代中解包16个整数: void unpack3bit(uint8_t* target, char* source, int size) { while(size > 0){ uint64_t t = *reinterpret_cast<uint64_t*>(source); target[0] = t & 0x7; target[1] = (t >> 3) & 0x7; target[2] = (t >> 6) & 0x7; target[3] = (t >> 9) & 0x7; target[4] = (t >> 12) & 0x7; target[5] = (t >> […]

C ++模块 – 为什么他们从C ++ 0x中删除? 他们会回来吗?

我刚刚在C ++ 0x中发现了这个旧的C ++ 0x草案 。 这个想法是通过编写只有.cpp文件才能离开当前的.h / .cpp系统,然后在编译过程中生成模块文件,然后再由其他.cpp文件使用。 这看起来像一个非常棒的function。 但我的问题是:为什么他们从C ++ 0x中删除它? 是因为技术上的困难太多了吗? 时间不够? 你觉得他们会考虑为它做一个更加版本的C ++吗?

在for循环中避免if语句?

我有一个名为Writer的类,它具有如下所示的函数writeVector : void Drawer::writeVector(vector<T> vec, bool index=true) { for (unsigned int i = 0; i < vec.size(); i++) { if (index) { cout << i << "\t"; } cout << vec[i] << "\n"; } } 我试图不要有重复的代码,同时仍然担心性能。 在函数中,我正在对我的for循环的每一轮执行if (index)检查,即使结果总是相同的。 这是对“担心performance”的反对。 我可以很容易地避免这种情况,把支票放在我以外的地方。 但是,我会得到大量重复的代码: void Drawer::writeVector(…) { if (index) { for (…) { cout << i << "\t" […]

const是否意味着C ++ 11中的线程安全?

我听说const在C ++ 11中是线程安全的 。 真的吗? 这是否意味着const现在相当于Java的synchronized ? 他们用完了关键字吗?

C ++标准委员会打算在C ++ 11中使用unordered_map破坏它所插入的内容吗?

已解决:这是libstdc ++ <v4.8.2中的一个错误,如果系统上存在GCC v4.8和clang> v3.2将会使用它。 有关报告,请参阅http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57619 。 感谢凯西和布赖恩给出了正确的答案。 尼尔 原始问题: 我刚刚失去了三天的时间跟踪一个非常奇怪的bug,unordered_map :: insert()破坏了你插入的variables。 这种非常不明显的行为仅出现在最近的编译器中:我发现叮当3.2-3.4和GCC 4.8是唯一certificate这个“特性”的编译器。 下面是我的主要代码库中的一些简化代码,它演示了这个问题: #include <memory> #include <unordered_map> #include <iostream> int main(void) { std::unordered_map<int, std::shared_ptr<int>> map; auto a(std::make_pair(5, std::make_shared<int>(5))); std::cout << "a.second is " << a.second.get() << std::endl; map.insert(a); // Note we are NOT doing insert(std::move(a)) std::cout << "a.second is now " << […]

缺省构造函数和析构函数的“= default”与“{}”有什么不同?

我最初发布这个只是关于析构函数的问题,但现在我添加了默认构造函数的考虑。 这是原来的问题: 如果我想让我的类是一个虚拟的析构函数,但是与编译器生成的相同,我可以使用=default : class Widget { public: virtual ~Widget() = default; }; 但是,似乎我可以通过使用空白定义来减lessinput来获得相同的效果: class Widget { public: virtual ~Widget() {} }; 这两个定义的行为有什么不同? 基于针对这个问题发布的回复,默认构造函数的情况看起来类似。 鉴于析构函数在“ =default ”和“ {} ”之间的含义几乎没有区别,这些选项对于默认构造函数在意义上几乎没有区别? 也就是说,假设我想创build一个types的对象将被创build和销毁,我为什么要说 Widget() = default; 代替 Widget() {} ? 我很抱歉,如果扩大这个问题后,其原来的发布是违反了一些SO规则。 为默认的构造函数发布几乎相同的问题让我觉得不那么理想。

#pragma曾经是C ++ 11标准的一部分吗?

传统上,避免在C ++中使用多头包含的标准和可移植的方法是使用#ifndef – #define – #endif预编译器指令scheme,也称为macros保护scheme (参见下面的代码片段)。 #ifndef MY_HEADER_HPP #define MY_HEADER_HPP … #endif 然而,在大多数的实现/编译器中(见下图),还有一个更为“优雅”的select,与macros观保护机制#pragma once有相同的作用。 与macros保护scheme相比, #pragma once有过几个优点,包括代码less,避免了名称冲突,有时也提高了编译速度。 做了一些研究,我意识到尽pipe#pragma once指令几乎被所有已知的编译器支持,但是#pragma once指令是否是C ++ 11标准的一部分, #pragma once是否是混淆的。 问题: 有人能澄清一下, #pragma once指令是否是C ++ 11标准的一部分? 如果它不是C ++ 11标准的一部分,是否有计划在更新的版本上包含它(例如,C ++ 14或更高版本)? 如果有人能够进一步阐述使用其中一种技术(例如,macros观防范与#pragma once )的优点/缺点,那也不错。

方便地在C ++中声明编译时string

在C ++编译期间能够创build和操作string有几个有用的应用程序。 尽pipe可以在C ++中创build编译时string,但是这个过程非常麻烦,因为string需要被声明为可变字符序列,例如 using str = sequence<'H', 'e', 'l', 'l', 'o', ', ', 'w', 'o', 'r', 'l', 'd', '!'>; 诸如string连接,子串提取等许多操作可以很容易地实现为对字符序列的操作。 是否可以更方便地声明编译时string? 如果不是的话,有没有一个scheme可以方便的声明编译时间string? 为什么现有的方法失败 理想情况下,我们希望能够声明编译时间string如下: // Approach 1 using str1 = sequence<"Hello, world!">; 或者,使用用户定义的文字, // Approach 2 constexpr auto str2 = "Hello, world!"_s; decltype(str2)将有一个constexpr构造函数。 方法1的一个更复杂的版本可以实现,利用这个事实,你可以做到以下几点: template <unsigned Size, const char Array[Size]> struct foo; 然而,数组需要有外部链接,所以为了让方法1工作,我们必须写这样的东西: /* […]

如何将元组展开成可变参数模板函数的参数?

考虑使用可变参数模板参数的模板函数的情况: template<typename Tret, typename… T> Tret func(const T&… t); 现在,我有一个值元组。 如何使用元组值作为参数调用func() ? 我已经阅读了有关bind()函数对象, call()函数,还有apply()函数在不同的一些现在已经过时的文档。 GNU GCC 4.4的实现似乎在bind()类中有一个call()函数,但是关于这个主题的文档很less。 有人提出手写recursion攻击,但可变参数模板参数的真正价值是能够在上面的情况下使用它们。 有没有人有一个解决scheme,或暗示在哪里阅读?