当我std::vector::reserve在标识符属性时调用时std::vector<Foo*> reserve(...)什么都不做:
std::vector<int*> bar;
bar.reserve(20);
//I expect bar.size to return 20...
std::size_t sz = bar.size();
for(std::size_t i = 0; i < sz; ++i) {
//Do Stuff to all items!
}
Run Code Online (Sandbox Code Playgroud)
前面提到的for循环运行正好零次,bar.size()返回零.我不记得所有其他STL容器是否也是如此,但如果是这样,包括std :: vector的行为:为什么?
我正在使用一个充分利用它的程序std::vector.还有很多分配/解除分配,数十亿分配,我试图避免尽可能多的分配/解除分配.由于我对C++比较陌生,所以我在使用向量时会有一些关于分配的问题(例如,在向其添加元素时).我在Win7 64位机器上,程序是32位,我正在使用当前版本的MinGW编译器.
我想知道,在下列情况下会发生什么,即如果复制了矢量,作为参考传递,...
1.
std::vector<T> fillVector() {
std::vector<T> returnVector;
...
return returnVector;
}
std::vector<T> myVector = fillVector();
Run Code Online (Sandbox Code Playgroud)
2.
std::vector<T>& fillVector() {
std::vector<T>* returnVector = new std::vector<T>;
...
return (*returnVector);
}
std::vector<T> myVector = fillVector();
Run Code Online (Sandbox Code Playgroud)
3.
std::vector<T>* fillVector() {
std::vector<T>* returnVector = new std::vector<T>;
...
return returnVector;
}
std::vector<T>* myVector = fillVector();
Run Code Online (Sandbox Code Playgroud)
以下是不同的操作:
4.
std::vector<T> myVector1;
... (myVector1 being filled)
std::vector<T> myVector = myVector1;
Run Code Online (Sandbox Code Playgroud)
5.
std::vector<T>* myVector1 = new std::vector<T>;
... (myVector1 being filled)
std::vector<T> myVector = (*myVector1);
Run Code Online (Sandbox Code Playgroud)
假设我不想改变 …
我正在处理一些相对较大的整数向量,我有一个顶级向量,我需要累积其他(临时)向量的结果.
将它扩展到原地很遗憾,因为我收到了从另一个API预先烹饪的临时向量,并且由于同样的原因我坚持使用GCC 4.1.2,所以没有一个很好的移动语义或std :: move of C++ 11.
目前我正在使用insert进行复制,例如:
vector<int> accumulator;
for(){
vector<int> tempVector = vectReturningFunction();
...
if(!tempVector.empty()){
accumulator.insert(accumulator.end(), tempVector.begin(), tempVector.end());
}
}
Run Code Online (Sandbox Code Playgroud)
由于临时常规是一次性的,数据可以足够大,我希望能够移动而不是复制,但我无法找到一种优雅的方式来做到这一点.
任何解决方案甚至只是指针(没有双关语意图)在一个有用的方向将非常感激.几年前,我对Stroustrup前C++ 11读取配方有一个模糊的记忆,可以跨越STL容器,但是现在有很多C++ 11的东西,没有多少搜索服务.
谢谢.
如果我有std::deque并且std::vector想要将它们组合到std::deque,我可以通过以下方式进行:
typedef int T; // type int will serve just for illustration
std::deque< T > deq(100); // just some random size here
std::vector< T > vec(50);
// ... doing some filling ...
// now moving vector to the end of queue:
deq.insert(
deq.end(),
std::make_move_iterator( vec.begin() ),
std::make_move_iterator( vec.end() )
);
std::cout << deq.size() << std::endl;
Run Code Online (Sandbox Code Playgroud)
我们知道向量的大小,但我们不能在最后std::deque使用之前保留内存std::deque.insert(...)。那么这是将所有元素移动std::vector到末尾的最快方法std::deque吗?还是我错过了什么?
谢谢你。
resize() 根据给定的大小添加/删除元素。Reserve() 保留内存空间,它不会重新分配内存。我的问题是 resize 是否也与向量的容量相同,只是不会增加?
要添加,将组合:
std::vector<X> vector;
vector.reserve(5);
vector.resize(5);
Run Code Online (Sandbox Code Playgroud)
有道理吗?是多余的吗?这里的目标是能够覆盖向量中的值,而无需向量分配任何额外空间。
我想知道如何将std :: vector转换为void*,例如,
std::vector<ColorData> piexls_ (w*h, background_color);
Run Code Online (Sandbox Code Playgroud)
现在我想将piexls_转换为(void*),以便我可以记忆pixel_.
memcpy ((void*)destinationBuffer->pixels_, (void*)sourceBuffer->pixels_, \
sizeof(ColorData)*destinationBuffer->width_*destinationBuffer->height_);
Run Code Online (Sandbox Code Playgroud)
但是,当我运行此代码时,我得到错误说 invalid cast from type ‘std::vector<image_tools::ColorData>’ to type ‘void*’
如何将std :: vector转换为void*.非常感谢!
该文档说,size_type的std::vector是/ usually / size_t,这是合理的,因为实现可以选择使用不同的东西。
但是为什么size_type = size_t在std::array。特别是在这里,因为std::array使用很少µC,所以最好使实现具有一定的自由度。
这是文档缺陷吗?
给定以下向量:
std::vector<int> foo{1,2,3,4,5,6,7};
std::vector<int> bar{10,20,30,40,50,60,70};
Run Code Online (Sandbox Code Playgroud)
最后,我想foo包含{ 10, 2, 30, 4, 50, 6, 70 }表示替换所有奇数的值。
我已经尝试过 std::replace_if 算法,但是如何访问条形对应的值?
// replace_copy_if example
#include <iostream> // std::cout
#include <algorithm> // std::replace_copy_if
#include <vector> // std::vector
bool IsOdd (int i) { return ((i%2)==1); }
int main () {
std::vector<int> foo{1,2,3,4,5,6,7};
std::vector<int> bar{10,20,30,40,50,60,70};
std::replace_if (foo.begin(), foo.end(), IsOdd, 0);
std::cout << "foo contains:";
for (auto i: foo){ std::cout << ' ' << i; }
std::cout << '\n';
return 0;
}
// output …Run Code Online (Sandbox Code Playgroud) 我想将指向Object类的共享指针存储在向量中:
测试代码:
#include <vector>
#include <iostream>
#include <memory>
using namespace std; // only for brevity
class Object
{
public:
int n;
Object(int n) : n(n) { cout << "Object(" << n <<")\n"; }
~Object() { cout << "~Object(" << n << "))\n"; n = 0xdddddddd; }
};
void Test()
{
std::shared_ptr<Object> p1(make_shared<Object>(Object(123)));
std::vector<shared_ptr<Object>> v;
cout << "before push_back\n";
v.push_back(std::make_shared<Object>(Object(2)));
v.push_back(p1);
cout << "after push_back\n";
cout << "Vector content:\n";
for (auto& p : v)
cout << " " << …Run Code Online (Sandbox Code Playgroud) 我知道这std::vector<bool>很糟糕,但我有一个非常好的用例。
我想做这样的事情:
uint8_t data [] = {7,32};
std::vector<bool> vb/*...*/ ;
// now vb is size of 8 vector with this values:
// false, false, false, false, false, true, true, true, (7)
// false, false, true, false, false, false, false, false (32)
Run Code Online (Sandbox Code Playgroud)
注意:我知道我可以手动解析输入的每个字节并进行 8 次插入,但我正在寻找标准中预先构建的内容