标签: stdvector

这个模型需要互斥锁吗?

我正在设计一个带有服务器的程序,让两个客户端进行通信.有一个客户端执行命令,另一个客户端执行命令.

为了使这项工作,我有两个线程:一个用于受控客户端的线程,另一个用于控制器客户端.

受控客户端始终保持连接,具有包含任务的向量,并在添加任务时执行这些任务.它有一个无限的while循环,当连接关闭时它会停止.

控制器 - 客户端将任务添加到向量.

现在因为在两个线程之间共享一个向量,可能会出现竞争条件,但由于一个线程只添加对象而另一个只弹出对象,这是必要的吗?我试图用这个问题制作一个流程图,但也许不清楚.我真的不知道如何创建流程图: 在此输入图像描述

我正在使用std::vector <CustomClass>C++实现这一点.

提前谢谢,
ief2

编辑:附加问题:vector.size()呼叫需要互斥吗?

c++ mutex pthreads race-condition stdvector

2
推荐指数
1
解决办法
695
查看次数

如何以这种方式使用矢量?

有人可以解释一下这段代码吗?函数栏如何接受对向量的第一个元素的引用?

jintArray arry;
std::vector<int> foo = GetIntegerArray(env, arry);
bar(&foo[0])
Run Code Online (Sandbox Code Playgroud)

酒吧的protoytpe是哪里

bar(int* array)
Run Code Online (Sandbox Code Playgroud)

c++ vector stdvector

2
推荐指数
1
解决办法
468
查看次数

std :: vector索引总是更快吗?

当使用std :: vector时,通过索引而不是使用迭代器来传递所有向量的元素总是更快?

我写了简单的愚蠢测试,VS 2010,优化被禁用

#include <vector>
#include <iostream>
#include <ctime>

const int SIZE = 100000;    

int main()
{    
    std::vector<int> vInt;
    int i, temp;
    srand(time(0));
    for(i = 0; i<SIZE; i++)
        vInt.push_back(rand());

    time_t startTime, endTime;
    std::vector<int>::iterator it = vInt.begin(), itEnd = vInt.end();
startTime = clock();
for( ; it != itEnd; it++)
        temp = *it;
    endTime = clock();
    std::cout<<"Result for iterator: "<<endTime - startTime;

    i = 0;
    int size = vInt.size();
    startTime = clock();
    for(; i<size; i++)
        temp = vInt[i];
    endTime = …
Run Code Online (Sandbox Code Playgroud)

c++ indexing iterator stl stdvector

2
推荐指数
1
解决办法
540
查看次数

初始化指针向量(自动)

尝试NULL通过std::vector构造函数初始化指针向量时遇到编译错误.我简化了指令以保持简单:

vector<int*> v (100,NULL)
Run Code Online (Sandbox Code Playgroud)

我想它与const T& value= T()(构造函数的参数)和非常值NULL 之间的不兼容性有关,但我希望得到一些进一步的解释.

谢谢

c++ null pointers stdvector

2
推荐指数
1
解决办法
7462
查看次数

std :: vector的push_back()导致奇怪的编译时错误消息

我的代码片段:

void
RMWavefrontFileImporter::loadVertexIntoVector(
    const std::vector<std:string> lineElements,
    std::vector<const RM3DVertex>* vertices)
{
    assert(vertices);

    std::unique_ptr<const RM3DVertex> verticeRef = verticeWithElements(lineElements);

    const RM3DVertex* vertex = vertexRef.get();
    assert(vertex);

    vertices->push_back(*vertex);
}
Run Code Online (Sandbox Code Playgroud)

我收到的错误消息:

无法使用类型为'const RM3DVertice*'的左值初始化'void*'类型的参数

我没有看到问题.有什么明显我想念的吗?

c++ std push-back stdvector

2
推荐指数
1
解决办法
346
查看次数

如何创建一个类似std :: vector的类,它可以二进制读/写巨大的块?

问题

我有这个旧的pre-stl C++代码,我想将其转换为std C++ 11而不会降低效率.

using T = unsigned;  // but can be any POD
FILE* fp = fopen( outfile.c_str(), "r" );
T* x = new T[big_n];
fread( x, sizeof(T), big_n, fp );
delete[] x;
fclose( fp );
Run Code Online (Sandbox Code Playgroud)

请注意,big_n非常大 - 就像数百万条记录一样大,所以任何低效率都会发生.

以前的解决方案

在上一个问题的答案中,我接受了这个解决方案:

std::vector<T> x(big_n);
fread(x.data(), sizeof(T), big_n, fp);
Run Code Online (Sandbox Code Playgroud)

问题和解决方案

之前的解决方案有效,但构造函数实际上调用了T的默认构造函数big_n次.当big_n真的很大时(这完全不必要,因为我要从磁盘中fread()整个块),这非常慢.FWIW,在我的一个文件的测试用例中,它需要3秒而不是200ms.

所以我尝试使用它:

std::vector<T> x;
x.reserve( big_n );
fread(x.data(), sizeof(T), big_n, fp);
Run Code Online (Sandbox Code Playgroud)

这似乎有效,但后来我遇到了size()返回0而不是big_n的问题.

如何在不损失太多效率的情况下纠正此问题?

附录

我只是注意到std::vector<>可以采用自定义分配器.可以使用那种形式的构造函数来解决我的问题吗?我现在正在研究这种方法.

什么对我有用

除了jrok的简单阵列解决方案之外,我还研究了下面的Ali的自定义分配器解决方案.我决定采用jrock的解决方案,因为它易于理解/降低维护.

我想出的工作代码如下:

#include <vector>
#include <set>
#include <memory>
#include <fstream> …
Run Code Online (Sandbox Code Playgroud)

c++ stdvector c++11

2
推荐指数
1
解决办法
669
查看次数

从std :: vector <bool>获取bool引用

我知道这是一个坏习惯,但我想知道一些解决方法或破解这个问题.我有一个这样的课:

template <class T>
class A : std::vector<T> {
  T& operator()(int index) { // returns a _reference_ to an object
    return this->operator[](index);
  }
};
Run Code Online (Sandbox Code Playgroud)

可以做这样的事情:

A<int> a{1,2,3,4};
a(3) = 10;
Run Code Online (Sandbox Code Playgroud)

但是如果有人使用bool作为模板参数,它就会停止工作

A<bool> a{true, false, true};
std::cout << a(0) << std::endl; // not possible
if (a(1)) { /* something */ }   // not possible
Run Code Online (Sandbox Code Playgroud)

std::vector<bool>是矢量的专用版本(http://www.cplusplus.com/reference/vector/vector-bool/),它不允许这样的事情.

有没有办法从std :: Vector获取布尔变量的引用?或者任何不同的解决方

c++ boolean stdvector

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

矢量的逗号分隔标记到const char**

我试图将逗号分隔的字符串转换为const char*的向量.使用以下代码,按预期输出为

ABC_
DEF
HIJ
Run Code Online (Sandbox Code Playgroud)

但我明白了

HIJ
DEF
HIJ
Run Code Online (Sandbox Code Playgroud)

我哪里错了?

码:

#include <iostream>
#include <boost/tokenizer.hpp>
#include <vector>
#include <string>
using namespace std;

int main()
{
   string s("ABC_,DEF,HIJ");
   typedef boost::char_separator<char> char_separator;
   typedef boost::tokenizer<char_separator> tokenizer;

   char_separator comma(",");
   tokenizer token(s, comma);
   tokenizer::iterator it;

   vector<const char*> cStrings;

   for(it = token.begin(); it != token.end(); it++)
   {
      //cout << (*it).c_str() << endl;
      cStrings.push_back((*it).c_str());
   }

   std::vector<const char*>::iterator iv;
   for(iv = cStrings.begin(); iv != cStrings.end(); iv++)
   {
      cout << *iv << endl;
   }
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

http://ideone.com/3tvnUs

编辑:解决方案帮助下面的答案:( …

c++ arrays string stdvector boost-tokenizer

2
推荐指数
1
解决办法
558
查看次数

在实现std :: vector时,我是否必须拥有end()的"end"指针?

假设我有自己的实现std::vector,它为迭代提供begin()和end()函数.可能会发生size()== capacity()和返回的指针end()不归我所有.它是安全的还是我需要确保size()< capacity()?

我知道这一难题可以通过使用自定义的迭代器类来克服,但在这里,我说的是,当简单的情况下,begin()简单地返回一个指向缓冲区的开始,并end()到begin()+size().

c++ memory memory-management stdvector

2
推荐指数
1
解决办法
99
查看次数

是否可以为std :: array类型添加自己的构造函数?

我试图为std::array类型添加我自己的构造函数,但我不确定是否可能以及如何做到这一点......

我试过这样的事:

typedef unsigned char byte_t;

namespace std {
  template<std::size_t _Nm>
  array::array(std::vector<byte_t> data)
  {
    // Some content
  }
}
Run Code Online (Sandbox Code Playgroud)

我想创建一个非常简单的机制来转换std::vector<byte_t>到std::array<byte_t, size>.

  1. 有可能的?
  2. 我怎样才能做到这一点?

我正在使用C++ 14(我不能在我的项目中使用更新的标准)

c++ constructor-overloading stdvector stdarray c++14

2
推荐指数
1
解决办法
127
查看次数