如何std::array从范围初始化(由一对迭代器定义)?
像这样的东西:
vector<T> v;
...
// I know v has exactly N elements (e.g. I just called v.resize(N))
// Now I want a initialized with those elements
array<T, N> a(???); // what to put here?
Run Code Online (Sandbox Code Playgroud)
我以为array会有一个构造函数接受一对迭代器,所以我可以做array<T, N> a(v.begin(), v.end()),但它似乎根本没有构造函数!
我知道我可以copy将矢量放入数组中,但我宁愿直接用矢量内容初始化数组,而不是先默认构造它.我怎么能够?
请考虑以下代码:
std::vector vec;
vec.reserve(500);
size_t cap = vec.capacity();
std::vector newVec = std::move(vec);
assert(cap == newVec.capacity());
Run Code Online (Sandbox Code Playgroud)
在几乎任何你遇到的实现中,这都可行.我不关心实现什么.我想知道标准需要什么.移动的vector容量是否与原始容量相同?或者断言触发器?
我想创建一个类方法,它将std :: vector引用作为参数,我想将它与不同类型的数据一起使用.
该函数应如下所示:
void some_function(const std::vector & vect){ //do something with vector }
Run Code Online (Sandbox Code Playgroud)
我想用它来举例如:
std::vector<int> v1;
some_function(v1);
std::vector<string> v2;
some_function(v2);
Run Code Online (Sandbox Code Playgroud)
我希望我明白我的观点.我是否必须制作这样的模板方法:
template<class T>
void some_function(std::vector<T> & vect){}
Run Code Online (Sandbox Code Playgroud)
或者我可以用另一种方式吗?如果必须,请告诉我如何在课堂上编写该方法.
感谢帮助!
我想在向量中存储一组线程,并在退出程序之前将它们全部加入.尝试加入第一个线程时,无论我在集合中放置了多少,我都会收到以下错误:
system_error: thread::join failed: No such process
Run Code Online (Sandbox Code Playgroud)
这是一些演示我的问题的简单代码:
#include <thread>
#include <iostream>
#include <vector>
#include <functional>
using std::cout;
using std::endl;
using std::vector;
using std::thread;
using std::mem_fn;
int main()
{
vector<thread> threads(1);
threads.push_back(thread([]{ cout << "Hello" << endl; }));
for_each(threads.begin(), threads.end(), mem_fn(&thread::join));
// also tried --> for(thread &t : threads) t.join()
}
Run Code Online (Sandbox Code Playgroud)
我正在使用以下内容构建它(尝试过clang ++ 4.2.1和g ++ 5.3.1):
g++ -o src/thread_test.o -c -std=c++14 src/thread_test.cpp -pthread
g++ -o thread_test src/thread_test.o -pthread
Run Code Online (Sandbox Code Playgroud)
我在互联网上看到很多这样的例子.合同中的某些内容是否发生了变化,<thread>或者<vector>说这些例子已经解散了?
注意:作为未来读者的一小部分,我在尝试{}赋值后最终添加了(1)构造函数参数,由于私有拷贝构造函数而失败.在试图避免复制构造函数时,我最终分配了未初始化的线程 - 粗心的错误.
我们如何分析std :: vector中后面的插入(push_back)?它的摊销时间是每次插入O(1).特别是在史蒂芬牛逼Lavavej在Channel9的视频,并在此(17:42以后),他说,以获得最佳性能微软的这个方法的实现由大约1.5增加了向量的能力.
这个常数如何确定?
从函数返回stl向量时:
vector<int> getLargeArray() { ... }
Run Code Online (Sandbox Code Playgroud)
回报是否是昂贵的复制操作?我记得在哪里读过矢量分配很快 - 我应该要求调用者传递引用吗?
void getLargeArray( vector<int>& vec ) { ... }
Run Code Online (Sandbox Code Playgroud) 基于在回答这些 问题 在这里,我知道这肯定是最好使用C++ 14的std::make_unique,而不是emplace_back(new X)直接.
那就是说,打电话是首选
my_vector.push_back(std::make_unique<Foo>("constructor", "args"));
Run Code Online (Sandbox Code Playgroud)
要么
my_vector.emplace_back(std::make_unique<Foo>("constructor", "args"));
Run Code Online (Sandbox Code Playgroud)
也就是说,我应该使用push_back或emplace_back何时添加std::unique_ptr构造的std::make_unique?
====编辑====
为什么?c:< - (微笑)
考虑以下insert和emplace成员函数std::vector<T>:
template <class... Args> iterator emplace(const_iterator position, Args&&... args);
iterator insert(const_iterator position, const T& x);
iterator insert(const_iterator position, T&& x);
iterator insert(const_iterator position, size_type n, const T& x);
Run Code Online (Sandbox Code Playgroud)
如果通过引用向量本身的元素作为参数来调用其中一个,该怎么办?通常,它们中的每一个都会使对所有元素的引用无效,这些元素position可能包括参数,或者如果发生重新分配,则引用所有元素,这肯定包含它,但这是否意味着这样的调用无效或插入(似乎先发生?
查看一些常见的实现会产生奇怪的结果:
libstdc ++在移动任何元素之前复制参数,但仅在const T&重载中insert.它包含这个评论:
这三个操作的顺序由C++ 0x情况决定,其中移动可以改变属于现有向量的新元素.这只是调用者通过const lvalue ref获取元素的问题(见23.1/13).
但是C++11§23.1只是容器库的简短摘要,即使我们假设这是指§23.2.1(以前是C++ 03中的§23.1),仅仅是§23.2.1/ 13给出了分配器感知容器的定义,这似乎与此无关.我已经看了第23章,但我没有找到任何相关的东西.
libc ++在移动任何元素之前创建一个临时元素emplace,而在insert其中首先移动元素但将参数引用转换为指针并调整它以确保它指向原始元素 - 但同样,它仅在const T&重载中完成所有这些操作.
在所有情况下移动任何元素之前,Visual C++会创建一个副本/临时文件.
我错过了标准定义此行为的地方吗?为什么我看到的三个C++库彼此不一致?为什么libstdc ++评论说它只是一个问题insert(const_iterator, const T&)?如果标准不要求这个工作,为什么图书馆总是懒得让它工作呢?(当然这会花费一些本来可以避免的副本和/或移动.)最后,如果我正在实现一个类似的容器,std::vector我应该让它工作吗?
我正在尝试将地图复制到对的向量中,因此我可以通过对的second数据成员对向量进行排序.我已经解决了这样做:
void mappedWordsListSorter(){
for (auto itr = mappedWordsList.begin(); itr != mappedWordsList.end(); ++itr){
vectorWordsList.push_back(*itr);
}
sort(vectorWordsList.begin(), vectorWordsList.end(), [=](pair<string, int>& a, pair<string, int>& b){return a.second > b.second;});
}
Run Code Online (Sandbox Code Playgroud)
我需要找到一种方法来实现这一点而不使用原始循环,而是使用标准库.我通过传递地图的键或值来遇到很多例子.我需要复制到一个矢量pairs<string, int>.最好的方法是什么?