标签: stdvector

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
查看次数

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::vector&lt;bool&gt; ?

我编写工具来转储和加载二进制文件中的常见对象。在第一个快速实现中,我为std::vector<bool>. 它有效,但显然没有在内存中进行优化。

template <>
void binary_write(std::ofstream& fout, const std::vector<bool>& x)
{
    std::size_t n = x.size();
    fout.write((const char*)&n, sizeof(std::size_t));
    for(std::size_t i = 0; i < n; ++i)
    {
        bool xati = x.at(i);
        binary_write(fout, xati);
    }
}

template <>
void binary_read(std::ifstream& fin, std::vector<bool>& x)
{
    std::size_t n;
    fin.read((char*)&n, sizeof(std::size_t));
    x.resize(n);
    for(std::size_t i = 0; i < n; ++i)
    {
        bool xati;
        binary_read(fin, xati);
        x.at(i) = xati;
    }
}
Run Code Online (Sandbox Code Playgroud)

如何std::vector<bool>在我的流中复制 a 的内部存储器?

注意: 我不想用 其他东西替换std::vector<bool> 。

c++ boolean stdvector

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

使用boost :: spirit将其解析为vector <vector <double >>

我的目的是将逗号分隔的值列表解析为嵌套向量.这个清单是二维的.基本问题是:

是否可以使用boost :: spirit解析为向量的向量?

像"牵引"下的表格:

' 
' RPM
0,5000,10000,15000,20000,25000
'
' Temp
'
-40.,0.,20.,40.
'
' Traction
200.,175.,170.,165.,160.,150.
200.,175.,170.,165.,160.,150.
165.,165.,160.,155.,145.,145.
160.,155.,150.,145.,145.,140.
'
Run Code Online (Sandbox Code Playgroud)

在接下来的步骤中,我想阅读4维数据,但是现在我正在努力解决第二个问题.数据结构如下:

struct table {
    std::vector<double>  index;
    std::vector<double>  index2;
    std::vector<std::vector<double> > base;
};
Run Code Online (Sandbox Code Playgroud)

语法是恕我直言,非常简单如下:

comment %= qi::lexeme[ '\'' >> *(qi::standard::char_ - qi::eol)] >> qi::eol;
commentblock = comment >> *(comment);
doublevector = qi::double_ % ',' >> qi::eol ;
vectorblock = *doublevector;
start = commentblock            >>
        doublevector            >>
        commentblock            >>
        doublevector            >>
        commentblock            >>
        vectorblock             >>
        commentblock            >>
        qi::eoi
        ;
Run Code Online (Sandbox Code Playgroud)

到目前为止,我解析这两个向量 …

c++ boost boost-spirit stdvector

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

返回在函数内填充的 const char* 向量是否是明确定义的行为

我目前正在学习 vulkan。在其中一个教程中,我看到了一个大致执行以下操作的函数:

#define SOMESTRING "Hello World!"

std::vector<const char*> buildVector() {
    std::vector<const char*> vec;
    vec.push_back(SOMESTRING);
    return vec;
}
Run Code Online (Sandbox Code Playgroud)

当我看到这个时,我想知道:这是定义的行为吗?字符串的内容不是"Hello World!"位于堆栈上,因此一旦函数返回就无效吗?如果这是未定义的行为,那么正确的方法是什么?不幸的是,std::string由于 vulkan API ,使用不是一种选择。

c++ c-strings stdvector

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

std::vector::iterator 是否可以合法地成为指针

我已经听说std::vector<T>::iterator可以简单地T*代替迭代器类。

但这真的合法吗?

指针算术仅适用于数组,std::vector不创建数组对象 ( T[]) 而是创建连续对象(通过放置 new)。

此外,我认为std::launder甚至需要(C++17)来访问单个元素(正如我们可以在 的static_vector示例注释中阅读的那样std::aligned_storage)。

我认为这大致相当于遵循我认为是未定义的行为。

template <typename T, std::size_t N, typename F>
void test_array(F func)
    typename std::aligned_storage<sizeof (T) * N, alignof (T)>::type data;
    char* buffer = &data;
    for (std::size_t i = 0; i != N; ++i) {
        new (buffer + i * sizeof(T)) T;
    }
    T* array = reinterpret_cast<T*>(buffer);
    for (std::size_t i = 0; i != N; …
Run Code Online (Sandbox Code Playgroud)

c++ pointers iterator stdvector language-lawyer

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

专门研究 std::vector 如何增长

C++ 标准建议 std::vector 呈指数增长,以便在重新分配方面具有“摊销不变成本”。

虽然这种类型的增长适用于大多数场景,但可能有一种情况我发现我需要使用不同的算法来增长向量。

有没有办法自定义 std::vector 的增长方式以及它在重新分配之前检查的条件?

c++ stdvector

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

Why is the copy-ctor preferred over move-ctor when std::vector relocates storage?

I am learning the behavior of std::vector: how it relocates (copies/moves) objects when reserving more capacity:

#include<vector>
#include<iostream>
using namespace std;

struct A{
   A(const A& a){ i=a.i; cerr<<"copied "<<i<<endl; }  //(1)
   A(     A&& a){ i=a.i; cerr<<"moved "<<i<<endl; }
   A(int i):i(i){cerr<<"created "<<i<<endl;};
   A(){};
private:
   int i=0;
};
int main()
{
   vector<A> v1;
   size_t prevcap=v1.capacity();
   for(int i=0; i<10; ++i){
      v1.emplace_back(i);
      if(prevcap!=v1.capacity()){
         cerr<<"capacity increased to "<<v1.capacity()<<endl;
         prevcap=v1.capacity();
      }
      cerr<<"------"<<endl;
   }
}
Run Code Online (Sandbox Code Playgroud)

With my g++-10 the output is:

created 0
capacity increased to …
Run Code Online (Sandbox Code Playgroud)

c++ stdvector

6
推荐指数
0
解决办法
88
查看次数