是否可以使用自定义分配器进行std::vector内部分配?如果有,怎么样?
这是我之前提出的问题的后续问题"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++ 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++中,有一种简单的方法:
这个std :: string
\t\tHELLO WORLD\r\nHELLO\t\nWORLD \t
Run Code Online (Sandbox Code Playgroud)
成:
HELLOWORLDHELLOWORLD
Run Code Online (Sandbox Code Playgroud) 假设我有foo一个人口稠密的std::vector<double>.
我需要对这个向量的元素进行操作.我有动力写作
for (auto it : foo){
/*ToDo - Operate on 'it'*/
}
Run Code Online (Sandbox Code Playgroud)
但似乎这不会回写,foo因为它it是一个值类型:已经采用了向量元素的深层副本.
我可以提供一些指导auto来制作it参考类型吗?然后我可以直接操作it.
我怀疑我错过了一些简单的语法.
该[[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标准,我无法确定属性是否继承.
通常在SO(以及其他地方),我已经看到C++标准中的注释和示例不是规范性的说法 - 我可能已经多次提出这个主张.
但是,我在C++标准的核心语言规范中找不到这个事实的证据(目前我在查看n3979 C++ 14工作草案).
我能找到的最接近的报价见第17.5.1.2/2段:
标有"注释:"或"示例:"的段落是提供信息的,其他段落是规范性的.
但是,除非我错误地认为该段只适用于图书馆部分(即第18至30条和附件D).
因此,问题是:C++标准中的所有注释和示例都是非规范性的吗?脚注怎么样?
很长一段时间,gcc一直在提供许多内置的bit-twiddling函数,特别是尾随和前导0位的数量(也用于long unsigned和long long unsigned,有后缀l和ll):
- 内置功能:
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包装函数模板 …
我有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函数?如果没有,是否有更有效的方法手动完成?
考虑以下代码:
#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)