这个成语是什么,什么时候应该使用?它解决了哪些问题?当使用C++ 11时,成语是否会改变?
虽然在许多地方已经提到过,但我们没有任何单一的"它是什么"问题和答案,所以在这里.以下是前面提到的地方的部分列表:
c++ c++-faq copy-constructor assignment-operator copy-and-swap
(注意:这个问题是不必指定元素的数量,仍然允许直接初始化嵌套类型.)
这个问题讨论了C数组的用途int arr[20];.在他的回答中,@ James Kanze展示了C阵列的最后一个据点,它具有独特的初始化特性:
int arr[] = { 1, 3, 3, 7, 0, 4, 2, 0, 3, 1, 4, 1, 5, 9 };
Run Code Online (Sandbox Code Playgroud)
我们没有必要指定元素的数量,万岁!现在遍历它与C++ 11的功能std::begin和std::end从<iterator>(或您自己的变体),你永远需要甚至认为它的大小.
现在,有没有(可能是TMP)方法实现同样的目标std::array?使用宏可以使它看起来更好.:)
??? std_array = { "here", "be", "elements" };
Run Code Online (Sandbox Code Playgroud)
编辑:中间版本,从各种答案编译,如下所示:
#include <array>
#include <utility>
template<class T, class... Tail, class Elem = typename std::decay<T>::type>
std::array<Elem,1+sizeof...(Tail)> make_array(T&& head, Tail&&... values)
{
return { std::forward<T>(head), std::forward<Tail>(values)... };
}
// in code …Run Code Online (Sandbox Code Playgroud) 我怎样才能a3编译?
int main()
{
int a1[] = { 1, 2, 3 };
std::array<int, 3> a2 = { 1, 2, 3 };
std::array<int> a3 = { 1, 2, 3 };
}
Run Code Online (Sandbox Code Playgroud)
使用初始化列表时,对数组的大小进行硬编码是非常不方便的,也是很脆弱的,特别是长的列表.有什么工作吗?我希望如此,否则我很失望,因为我讨厌C阵列,std::array应该是他们的替代品.
可以将push_back不可复制但可移动类型的rvalues转换为该类型的向量:
#include <vector>
struct S
{
S(int);
S(S&&);
};
int main()
{
std::vector<S> v;
v.push_back(S(1));
v.push_back(S(2));
v.push_back(S(3));
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试初始化列表构造具有相同rvalues的向量时,我得到关于所需的复制构造函数的错误:
#include <vector>
struct S
{
S(int);
S(S&&);
};
int main()
{
std::vector<S> v = {S(1), S(2), S(3)};
}
Run Code Online (Sandbox Code Playgroud)
我在GCC 4.7中遇到以下错误:
In file included from include/c++/4.7.0/vector:63:0,
from test.cpp:1:
include/c++/4.7.0/bits/stl_construct.h: In instantiation of 'void std::_Construct(_T1*, _Args&& ...) [with _T1 = S, _Args = {const S&}]':
include/c++/4.7.0/bits/stl_uninitialized.h:77:3: required from 'static _ForwardIterator std::__uninitialized_copy<_TrivialValueTypes>::__uninit_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = const S*, _ForwardIterator = S*, …Run Code Online (Sandbox Code Playgroud) 我正在编写一些代码来集成ODE.这个问题同样是对解决方案的编码建议的要求,所以如果您对我即将提供的建议有其他建议,请告诉我!
由ODE集成商集成的"对象"以6个"块"为单位......原因是我有一个std :: vector of double,它们按以下方式排列:
前3个双打是位置坐标; x,y和z.接下来的3个双打是速度坐标; x,y和z.
那么,现在你知道了,我有一个函数,它将成对的"位置" """向量"""作为参数并返回某种结果......看看我要去哪里?
目前,该函数需要以下列方式使用2个位置坐标:
std::vector<double> magic_gravity_formula(const std::vector<double> &r1,
const std::vector<double> &r2, const double m1, const double m2)
Run Code Online (Sandbox Code Playgroud)
我不想将3组中的所有数据复制到新的向量 - 这是一种疯狂(并且非常慢)的编程方式.
我可以使用指向原始数据的指针......并且只是将指针传递给x坐标(3个双打块中的第一个项目) - 这对我来说似乎没有问题,但也许有更好的方法?有点像Python或Matlab数组切片?我可以这样做吗?
我想传递一个新的向量(或某种包装类?),从已存储在数组中的数据创建...有点像
std::vector<double> sub_section_of_data = data[0..2] // Obviously pseudocode!
Run Code Online (Sandbox Code Playgroud)
好的,所以上面的内容是荒谬的,因为大概是一种实现该语法的语言仍然可以进行复制操作,这可能很慢 - 正是我想要避免的...
所以,是的,我不确定这里最好的方式 - 有人能建议一个"好"的解决方案吗?(以非主观的方式!)
编辑:为了使这一点非常清楚 - 问题是我不想做类似的事情:
std::vector<double> r1_temp;
r1_temp.push_back(data[0]); // Copy ! Bad !
r1_temp.push_back(data[1]);
r1_temp.push_back(data[2]);
... same for an r2 ...
std::vector<double> force = magic_gravity_formula(r1, r2, m1, m2);
Run Code Online (Sandbox Code Playgroud)
编辑2:考虑编译器选项 - 编译器是否会通过以下方式更改函数以接受参数来为我优化我的代码:
std::vector<double> super_gravity_formula(double x1, …Run Code Online (Sandbox Code Playgroud) 我有一个算法,我想翻译我的代码,而不是使用数组,我想使用矢量.
你会如何翻译这个:( b + j和a的一面)
find_kth(a, b + j, i, size_b - j, k - j);
Run Code Online (Sandbox Code Playgroud)
哪里
int find_kth(int a[], int b[], int size_a, int size_b, int k);
Run Code Online (Sandbox Code Playgroud)
成
int find_kth(const vector<int>& a, const vector<int>& b, int size_a, int size_b, int k);
Run Code Online (Sandbox Code Playgroud)
它必须是等效的,所以像这样的调用返回相同的值,就像我使用数组一样:
min(a[0], b[0]);
Run Code Online (Sandbox Code Playgroud) 我有这段代码:
#include <iostream>
#include <vector>
using namespace std;
class Foo{
public:
Foo() noexcept {cout << "ctor" << endl;}
Foo(const Foo&) noexcept {cout << "copy ctor" << endl;}
Foo(Foo&&) noexcept {cout << "move ctor" << endl;}
Foo& operator=(Foo&&) noexcept {cout << "move assn" << endl; return *this;}
Foo& operator=(const Foo&) noexcept {cout << "copy assn" << endl; return *this;}
~Foo() noexcept {cout << "dtor" << endl;}
};
int main()
{
Foo foo;
vector<Foo> v;
v.push_back(std::move(foo));
// comment the above 2 lines …Run Code Online (Sandbox Code Playgroud)