我很难找到一个好的答案.出于某种原因,我认为STL排序将使用swap来实现,以便更好地支持复杂类型,但是当我最终挖掘代码时,它似乎实际上正在进行二进制复制.有人能证实吗?我猜二进制副本实际上更适合交换.
问题:是否使用交换实现了任何STL算法或容器操作?(std::swap显然在外面.)我想知道何时为复杂类型实现我自己的交换是谨慎的.
编辑:我问的原因是你是否有类似的东西:
class MyClass {
vector<int> vec_data;
int a;
int b;
}
vector<MyClass> my_vec;
sort(my_vec.begin(), my_vec.end(), MyCustomCompare);
Run Code Online (Sandbox Code Playgroud)
我想确保排序不是调用向量的复制构造函数,如果调用MyData的默认复制构造函数,就会发生这种情况.因此我的问题是排序调用交换,复制分配等?
可能重复:
查找给定字符串是否为回文结构或不是回文结构
我需要创建一个程序,允许用户输入一个字符串,我的程序将检查他们输入的字符串是否是回文(可以向前读取相同的单词).
我最近遇到了一段c ++代码,其中一个类与自己成为朋友.正如我在不同论坛上所读到的,一个班级已经是他自己的朋友.所以我想知道是否有一个特定的原因,为什么人们想要明确地让自己成为一个阶级朋友.
另一个问题是,让一个班级成为自己的朋友的原因是什么?
也许有经验的人可以澄清这个话题.
这是代码示例,用于说明我的问题:
template < typename T>
class Foo: public T
{
protected:
template < typename U>
friend class Foo;
}
Run Code Online (Sandbox Code Playgroud) 我想从char数组的开头提取一系列元素并将它们放入一个字符串中.范围可以小于或等于元素的数量.
这就是我想出的.
// buffer is a std::array<char, 128>
std::string message;
for (int i = 0; i < numberToExtract; ++i)
{
message += buffer.at(i);
}
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?
我一直在寻找像std :: string的迭代器构造函数.例如, std::string(buffer.begin(), buffer.end())但我不希望所有的元素.
谢谢.
我有一个以字符串形式出现并代表时间的字段.有时它在12小时内,有时在24小时内.可能的值:
是否有一个函数可以通过聪明的方式将这些转换为时间格式?选项1没有因为它是24小时格式,而选项2前面有0而选项3显然是24小时格式.Python/lib中是否有一个函数可以:
time = func(str_time)
Run Code Online (Sandbox Code Playgroud) 为什么我无法将一个整数值提取到Num变量中?
#include <sstream>
#include <vector>
#include <iostream>
using namespace std;
int main()
{
string Digits("1 2 3");
stringstream ss(Digits);
string Temp;
vector<string>Tokens;
while(ss >> Temp)
Tokens.push_back(Temp);
ss.str(Tokens[0]);
int Num = 0;
ss >> Num;
cout << Num; //output: 0
}
Run Code Online (Sandbox Code Playgroud) C++11std::begin(std::valarray&)以及std::end(std::valarray&).
C++17 引入了std::data()它与std::vector, std::array, C 风格的数组等一起使用。但是为什么没有为std::data()引入重载std::valarray?
std::valarray被指定为具有连续存储,可以通过获取a[0](见注释)的地址来访问。
std::data(std::valarray& a)可以简单地定义为 return &(a[0])。为什么没有做到这一点?是疏忽吗?
我的动机是我正在开发一个通用的序列化库。当它从源(例如 CBOR)接收连续的二进制数数组时,它会检测目标容器是否具有重载data(container)函数、container.resize(n)成员函数以及适当的value_type(匹配原始数字类型)。这三者的存在使得memcpy()将源数据直接高效地导入目标容器成为可能。如果有std::data(std::valarray&)超载,它会让我的生活更简单。缺少它并不是一个阻碍,但它确实使代码更加混乱。
附录:我想检测一个data函数的原因是它告诉我目标容器是连续的。如果它是连续的,那么我可以进行有效的字节复制(通过std::memcpy或std::copy无关紧要)。如果它不是连续的,那么我解压每次打开一个未对齐的源阵列头号和使用它附加到目标容器push_back,emplace等取决于容器的类型。
附录 2:我决定使用适配器和特征方法,而不是检测data函数的存在。这将使支持非标准或用户定义的容器类型变得更加容易。我关于为什么没有std::data(std::valarray& a)仍然站的问题。
附录 3:我应该澄清一下,我需要对 CBOR 类型的数组(只能是数字)执行此操作。此外,源缓冲区中的数字未与元素边界对齐。我知道二进制数据可能需要字节序交换,如果不小心处理,将字节复制到浮点类型可能会触发奇怪的 NaN 行为。
我现在后悔提到我的动机,应该让这个std::data(std::valarray& a)问题独立存在。这个问题已经变成了一个火车事故,哈哈。:-)
我想std::initializer_list在Visual Studio 2012中使用s,就像这个例子中的人一样.我的操作系统是Windows 8 x64.
因此,我最近安装了Visual C++编译器2012年11月的CTP,并且正如Microsoft所提到的,我更改了项目的平台工具集以使用新的更新编译器.
但即便这样做,也没有可用std::initializer_list的<initializer_list>头和头.但微软的链接网站告诉我(在标题"概述"下)初始化程序列表可用于该更新.我重新启动了IDE和我的电脑.我不确定是否可能是因为我(遗憾地)使用德语版的Visual Studio并且编译器更新是英文的.我究竟做错了什么?
更新:尝试编译auto a = { 0 };被IntelliSense批评的行,编译器输出显示'Microsoft Visual C++ Compiler Nov 2012 CTP' is for testing purposes only.然后编译器崩溃,并出现一个读取的错误窗口Microsoft (R) C/C++ Compiler Driver has stopped working.没有任何新语法,一切都可以编译并且可以在选择的新编译器中正常工作.