标签: stdvector

从数组构造向量

这表明我可以从数组构造一个向量,如下所示:

// the iterator constructor can be used to construct from arrays:
int myints[] = {16,2,77,29};
vector<int> myvector (myints, myints + sizeof(myints) / sizeof(int) );
Run Code Online (Sandbox Code Playgroud)

为什么构造函数的第二个参数myints + sizeof(myints) / sizeof(int)?

c++ stdvector

6
推荐指数
1
解决办法
3924
查看次数

是通过移动保留std :: vector :: data()吗?

可能重复:
移动向量是否会使迭代器失效?

请考虑以下代码:

std::vector<T> prepare(T*& data) {
    std::vector<T> buffer;
    // Fill in buffer.
    data = buffer.data();
    return buffer;
}

...

T* data;
auto vec = prepare(data);
// line 12
Run Code Online (Sandbox Code Playgroud)

vec.data() != data第12行可能吗?同样的,

std::vector<T> buffer;
// ... Fill in buffer ...
T* data = buffer.data();
auto vec = std::move(buffer);
// line 5
Run Code Online (Sandbox Code Playgroud)

vec.data() != data第5行有可能吗?

实际上两者都不可能在libstdc ++和libc ++的实现中,因为移动构造函数实现为简单的指针赋值,但似乎标准没有在其上指定任何内容(类似于移动std时需要保留的容量: :矢量?)."不变的复杂性"可以保证vec.data() == data吗?

c++ stdvector language-lawyer move-semantics c++11

6
推荐指数
1
解决办法
453
查看次数

C++:std :: vector []运算符

为什么std :: vector有2个运算符[] 实现?

reference       operator[]( size_type pos );
const_reference operator[]( size_type pos ) const;
Run Code Online (Sandbox Code Playgroud)

c++ stl std stdvector

6
推荐指数
1
解决办法
2762
查看次数

OpenMP中预先分配的私有std :: vector并行化为C++中的循环

我打算使用缓冲区std::vector<size_t> buffer(100),在循环并行化的每个线程中使用一个缓冲区,如此代码所示:

std::vector<size_t> buffer(100);
#pragma omp parallel for private(buffer)
for(size_t j = 0; j < 10000; ++j) {
    // ... code using the buffer ...
}
Run Code Online (Sandbox Code Playgroud)

此代码不起作用.虽然每个线程都有一个缓冲区,但它们的大小为0.

如何在每个线程的开头分配缓冲区?我还能用#pragma omp parallel for吗?我可以比这更优雅地做到这一点:

std::vector<size_t> buffer;
#pragma omp parallel for private(buffer)
for(size_t j = 0; j < 10000; ++j) {
    if(buffer.size() != 100) {
        #pragma omp critical
        buffer.resize(100);
    }
    // ... code using the buffer ...
}
Run Code Online (Sandbox Code Playgroud)

c++ for-loop openmp stdvector

6
推荐指数
2
解决办法
4882
查看次数

使用迭代器使用自己的元素追加std :: vector

下面的代码按预期工作(测试通过)但我想知道如果以这种方式使用迭代器在c ++中被认为是一种不好的做法,或者它是否正常.

也许这是特定的std::vector,其他集合表现不同,最佳实践在集合(甚至他们的实现)之间有所不同?

在其他语言中肯定不行,并且大多数情况下更改集合将使迭代器无效并抛出异常.

BOOST_AUTO_TEST_CASE (ReverseIteratorExample) {
    std::vector<int> myvector;
    for(int i = 0; i < 5; i++)
    {
        myvector.push_back(i);
    }

    // is this generally a bad idea to change the vector while iterating?
    // is it okay in this specific case?
    myvector.reserve(myvector.size() + myvector.size() - 2 );
    myvector.insert(myvector.end(), myvector.rbegin() + 1, myvector.rend() -1);

    int resultset [8] = { 0,1,2,3,4,3,2,1 };
    std::vector<int> resultVector( resultset, resultset + sizeof(resultset)/sizeof(resultset[0]) );
    BOOST_CHECK_EQUAL_COLLECTIONS(myvector.begin(), myvector.end(), resultVector.begin(), resultVector.end());
}
Run Code Online (Sandbox Code Playgroud)

总结问题:

  1. 在迭代时更改向量通常是个坏主意吗?
  2. 在这种特殊情况下可以吗?
  3. 这是特定的std::vector和其他集合表现不同? …

c++ iterator stdvector

6
推荐指数
1
解决办法
295
查看次数

当push_back新元素到std :: vector时,C++引用会发生变化

我不知道该怎么做 - 请告诉我下面的代码有什么问题.我修改了我的代码,将其简化为最简单的术语.有一个带有一堆MyNode对象的std :: vector.第一步是获取对这些节点之一(Data m_data)的一个数据元素的常量引用 - 在下面的示例中,在插入第二个节点之前只有一个节点,如下所示:

const cv::Data& currData = m_nodesVector[currIndex].GetData();
MyNode node(...);
m_nodesVector.push_back(node);
Run Code Online (Sandbox Code Playgroud)

正好在vector :: push_back调用中,currData的值发生了变化!我只是不明白.如何将新节点插入向量会将值引用更改为第一个节点的数据?!! 请注意,在"创建"第二个节点时,该值不会更改 - 但是在插入到std :: vector中的操作时.我的意思是,我认为std :: vector可能会重新调整一些内存,但这不应该改变引用权吗?

编译器= VS 2012

多谢你们.非常感激.

c++ reference push-back stdvector c++11

6
推荐指数
1
解决办法
3766
查看次数

std :: vector range构造函数的官方行为是什么,当第一个itr在最后一个之后?

假设你有一个有效的起点:

std::vector<UINT32> host = {1,2,3,4,5};
Run Code Online (Sandbox Code Playgroud)

当您尝试使用迭代器构造另一个向量时:

std::vector<UINT32> client(host.begin(),host.end());

// client.size() is 5. Elements begin -> end look just like host.
Run Code Online (Sandbox Code Playgroud)

但是如果迭代器倒退会发生什么呢?如果开始是在结束之后怎么办?

std::vector<UINT32> backwardsClient(host.end(), host.begin());

// What happens?
Run Code Online (Sandbox Code Playgroud)

c++ vector stdvector

6
推荐指数
1
解决办法
1715
查看次数

为什么需要std :: move来调用std :: vector的move assign运算符

我正在学习c ++ 11,我对移动语义和右值引用有疑问.我的示例代码如下(C++ Shell URL是cpp.sh/8gt):

#include <iostream>
#include <vector>

void aaa(std::vector<int>&& a)
{
    std::cout << "size of a before move: " << a.size() << std::endl;
    std::vector<int> v;
    v = a; /*std::move(a)*/
    std::cout << "size of a after move: " << a.size() << std::endl;
}

int main ()
{
  std::vector<int> foo (3,0);

  aaa(std::move(foo));

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果是:

size of a before move: 3  
size of a after move: 3
Run Code Online (Sandbox Code Playgroud)

这似乎性病::向量的线,则不会调用的移动赋值运算符v = a的功能aaa,否则a将有大小为0,而不是3.
但是,如果我改变 …

c++ stdvector rvalue-reference move-semantics c++11

6
推荐指数
2
解决办法
1665
查看次数

包含未初始化值的对象矢量

此代码是否会导致未定义的行为:

#include <vector>

struct S
{
    S() {}

    int x;
};

int main()
{
     std::vector<S> vec(5, S());
}
Run Code Online (Sandbox Code Playgroud)

由于S()默认初始化自动对象,因此其内容不会首先归零,因此x将是不确定的.然后将包含不确定值的对象复制到每个向量位置.

动机:我们可能期望这个行为与std::vector<S> vec(5);不是UB的行为相同(因为C++ 11),所以这是一个容易犯的错误.

正如Praetorian在评论中所提到的,在C++之前,11可以std::vector<S> vec(5);自由地进行5次默认初始化,或者对部分或全部项目使用复制构造函数.

c++ initialization stdvector undefined-behavior

6
推荐指数
1
解决办法
316
查看次数

循环遍历向量中的所有(无序)元素对

我有std::vector一些数据(在我的情况下是点),我想循环遍历所有不同的元素对.对的顺序并不重要(因为我只对点的距离感兴趣).使用经典for循环,我想要做的是:

std::vector<double> vec{-1., 3., 5., -8., 123., ...};

for (std::vector<double>::size_type first = 0; first < vec.size(); ++first) {
    for (std::vector<double>::size_type second = first+1; second < vec.size();
         ++second) {
        // Compute something using std::fabs(vec.at(first)-vec.at(second))
    }
}
Run Code Online (Sandbox Code Playgroud)

我现在的问题是,如果使用基于范围的循环可以更优雅地实现这一点.

c++ stdvector c++11

6
推荐指数
1
解决办法
518
查看次数