小编Tem*_*Rex的帖子

std :: vector中的自定义分配器

是否可以使用自定义分配器进行std::vector内部分配?如果有,怎么样?

c++ stl allocator c++11

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

为什么std :: tie没有标记为c ++ 14的constexpr?

这是我之前提出的问题的后续问题"C++ 14标准库的哪些部分可能是什么以及将制作哪些部分constexpr?" " constexpr运营商超载指南?"

在运行时世界中,为多个数据成员的结构重载的operator<一个很好的习惯用法std::tie将结构转换为a std::tuple并在其上进行捎带,operator<这就是Right Thing™(各种成员的字典比较).

在C++ 14,许多地方std::tuple制成constexpr,特别是make_tuple,std::get与前面提到的operator<.然而,似乎看似相关std::tie的没有标记constexpr.这很烦人,因为它使定义用户定义的文字类型在编译时可以比必要的更冗长.

问题:是否有任何技术原因std::tie未标记constexpr为C++ 14?

更新:LWG问题2301,在libc ++libstdc ++ bug 65978中实现

更新2:在修改libstdc ++错误报告后,由@JonathanWakely修复了3个多小时!

c++ tuples constexpr c++11 c++14

23
推荐指数
1
解决办法
1279
查看次数

排序字符串向量:plain C vs idiomatic C++ 11

我目前正在尝试学习C++ 11及其奇特的功能.具体而言,我正在寻找高效率的通用性.所以我很高兴在C++ 11中编写了一个程序来对输入文件的行进行排序以测试我的新技能.由于C++编译器的内联和良好功能,我期望在这个小例子上获得高性能.为了得到我的程序有多快的提示,我使用该qsort函数在C中攻击了完全相同的程序,因为它是原始C,没有对该函数执行内联,并且我的比较函数被调用间接并且需要做两个间接到访问char *表示字符串的指针.

事实

然而,我对结果感到非常惊讶,C似乎比C++快4倍.在8Mb文件中,我得到以下结果:

$ g++ -O3 -std=c++11 -o sort sort.C
$ time ./sort < huge > /dev/null

real    0m0.415s
user    0m0.397s
sys     0m0.013s

$ cc -O3 -Wall -o sortc sort.c
$ time ./sortc < huge  > /dev/null

real    0m0.104s
user    0m0.097s
sys     0m0.010s

$ wc -l huge
140190 huge
Run Code Online (Sandbox Code Playgroud)

请注意,我试图尽可能公平,编译选项是相同的,我的C程序(稍后转储)的行为与C++程序相同:输入行的大小没有限制,输入数量没有限制线.

我还注意到,虽然我的C程序malloc几乎每个输入行调用一次,但C++程序的每个输入行的比例为10!

代码

以下是我用来比较的两个程序.

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <memory>

int main () {
    typedef std::vector<std::string> svec;
    svec …
Run Code Online (Sandbox Code Playgroud)

c c++ sorting benchmarking c++11

22
推荐指数
4
解决办法
2075
查看次数

删除std :: string中的空格

在C++中,有一种简单的方法:

这个std :: string

\t\tHELLO WORLD\r\nHELLO\t\nWORLD     \t
Run Code Online (Sandbox Code Playgroud)

成:

HELLOWORLDHELLOWORLD
Run Code Online (Sandbox Code Playgroud)

c++ string removing-whitespace c++11

22
推荐指数
2
解决办法
5万
查看次数

强制auto成为循环范围内的引用类型

假设我有foo一个人口稠密的std::vector<double>.

我需要对这个向量的元素进行操作.我有动力写作

for (auto it : foo){
   /*ToDo - Operate on 'it'*/
}
Run Code Online (Sandbox Code Playgroud)

但似乎这不会回写,foo因为它it是一个值类型:已经采用了向量元素的深层副本.

我可以提供一些指导auto来制作it参考类型吗?然后我可以直接操作it.

我怀疑我错过了一些简单的语法.

c++ for-loop range auto c++11

22
推荐指数
4
解决办法
1700
查看次数

覆盖[[noreturn]]虚函数

[[noreturn]]属性可以应用于不打算返回的函数.例如:

[[noreturn]] void will_throw() { throw std::runtime_error("bad, bad, bad ...."); }
Run Code Online (Sandbox Code Playgroud)

但我遇到了以下情况(不,我没有设计这个):

class B {
public:
  virtual void f() { throw std::runtime_error(""); }
};

class D : public B {
  void f() override { std::cout << "Hi" << std::endl; }
};
Run Code Online (Sandbox Code Playgroud)

我真的想把属性[[noreturn]]放在B::f()声明上.但是我不清楚派生类中的覆盖会发生什么.从[[noreturn]]函数成功返回会导致未定义的行为,如果重写也继承了该属性,我当然不希望这样.

问题:通过覆盖[[noreturn] virtual void B::f(),我是否继承了该[[noreturn]]属性?

我查看了C++ 14标准,我无法确定属性是否继承.

c++ inheritance c++11 noreturn

22
推荐指数
2
解决办法
711
查看次数

C++标准的核心语言规范中的注释和示例是非规范性的吗?

通常在SO(以及其他地方),我已经看到C++标准中的注释和示例不是规范性的说法 - 我可能已经多次提出这个主张.

但是,我在C++标准的核心语言规范中找不到这个事实的证据(目前我在查看n3979 C++ 14工作草案).

我能找到的最接近的报价见第17.5.1.2/2段:

标有"注释:"或"示例:"的段落是提供信息的,其他段落是规范性的.

但是,除非我错误地认为该段只适用于图书馆部分(即第18至30条和附件D).

因此,问题是:C++标准中的所有注释和示例都是非规范性的吗?脚注怎么样?

c++ iso language-lawyer c++11 c++14

21
推荐指数
2
解决办法
606
查看次数

未定义的是__builtin_ctz(0)还是__builtin_clz(0)?

背景

很长一段时间,gcc一直在提供许多内置的bit-twiddling函数,特别是尾随和前导0位的数量(也用于long unsignedlong long unsigned,有后缀lll):

- 内置功能: int __builtin_clz (unsigned int x)

x从最高有效位开始返回前导0位的数量.如果x为0,则结果未定义.

- 内置功能: int __builtin_ctz (unsigned int x)

x从最低有效位开始返回尾随0位的数量.如果x为0,则结果未定义.

在每一个在线(免责声明:仅64位)编译器,我测试,然而,结果是,无论clz(0)ctz(0)返回底层内建类型,例如位的数目

#include <iostream>
#include <limits>

int main()
{
    // prints 32 32 32 on most systems
    std::cout << std::numeric_limits<unsigned>::digits << " " << __builtin_ctz(0) << " " << __builtin_clz(0);    
}
Run Code Online (Sandbox Code Playgroud)

实例.

尝试过的解决方法

在最新的锵SVN主干std=c++1y模式取得了所有这些功能放宽C++ 14 constexpr,这使得它们的候选在SFINAE表达式以用于围绕3包装函数模板 …

c++ bit-manipulation undefined-behavior constexpr c++14

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

合并矢量矢量到单个矢量中

我有T矢量矢量:

std::vector<std::vector<T>> vector_of_vectors_of_T;
Run Code Online (Sandbox Code Playgroud)

我想将它们全部合并到T的单个向量中:

std::vector<T> vector_of_T;
Run Code Online (Sandbox Code Playgroud)

我目前正在使用这种方法:

size_t total_size{ 0 };
for (auto const& items: vector_of_vectors_of_T){
    total_size += items.size();
}
vector_of_T.reserve(total_size);
for (auto const& items: vector_of_vectors_of_T){
    vector_of_T.insert(end(vector_of_T), begin(items), end(items));
}
Run Code Online (Sandbox Code Playgroud)

有更直接的方法吗?就像一个准备好的std函数?如果没有,是否有更有效的方法手动完成?

c++ algorithm vector c++11

20
推荐指数
2
解决办法
2426
查看次数

g ++和MSVS之间的名称查找差异

考虑以下代码:

#include <iostream>

namespace N {
    class A {};
    void f(A a) { std::cout << "N::f\n"; }
}

void f(int i) { std::cout << "::f\n"; }

template <typename T>
class Base {
  public:
    void f(T x) { std::cout << "Base::f\n"; }
};


template <typename T>
class X : public Base<T> {
  public:
    void g() {
        T t;
        f(t);
    }
};

int main()
{
    X<N::A> x1;
    x1.g();

    X<int> x2;
    x2.g();
}
Run Code Online (Sandbox Code Playgroud)

该代码旨在研究名称查找在C++中的工作方式.

如果我用GNU C++(版本6.1.0)编译该程序,它会打印:

N::f
::f
Run Code Online (Sandbox Code Playgroud)

但如果我用Microsoft Visual Studio 2015编译它,它会打印:

Base::f …
Run Code Online (Sandbox Code Playgroud)

c++ templates base-class dependent-name name-lookup

20
推荐指数
2
解决办法
555
查看次数