我正在设计一个带有服务器的程序,让两个客户端进行通信.有一个客户端执行命令,另一个客户端执行命令.
为了使这项工作,我有两个线程:一个用于受控客户端的线程,另一个用于控制器客户端.
受控客户端始终保持连接,具有包含任务的向量,并在添加任务时执行这些任务.它有一个无限的while循环,当连接关闭时它会停止.
控制器 - 客户端将任务添加到向量.
现在因为在两个线程之间共享一个向量,可能会出现竞争条件,但由于一个线程只添加对象而另一个只弹出对象,这是必要的吗?我试图用这个问题制作一个流程图,但也许不清楚.我真的不知道如何创建流程图:

我正在使用std::vector <CustomClass>C++实现这一点.
提前谢谢,
ief2
编辑:附加问题:vector.size()呼叫需要互斥吗?
有人可以解释一下这段代码吗?函数栏如何接受对向量的第一个元素的引用?
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) 当使用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) 尝试NULL通过std::vector构造函数初始化指针向量时遇到编译错误.我简化了指令以保持简单:
vector<int*> v (100,NULL)
Run Code Online (Sandbox Code Playgroud)
我想它与const T& value= T()(构造函数的参数)和非常值NULL 之间的不兼容性有关,但我希望得到一些进一步的解释.
谢谢
我的代码片段:
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*'类型的参数
我没有看到问题.有什么明显我想念的吗?
问题
我有这个旧的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) 我知道这是一个坏习惯,但我想知道一些解决方法或破解这个问题.我有一个这样的课:
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获取布尔变量的引用?或者任何不同的解决方
我试图将逗号分隔的字符串转换为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)
编辑:解决方案帮助下面的答案:( …
假设我有自己的实现std::vector,它为迭代提供begin()和end()函数.可能会发生size()== capacity()和返回的指针end()不归我所有.它是安全的还是我需要确保size()< capacity()?
我知道这一难题可以通过使用自定义的迭代器类来克服,但在这里,我说的是,当简单的情况下,begin()简单地返回一个指向缓冲区的开始,并end()到begin()+size().
我试图为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>.
我正在使用C++ 14(我不能在我的项目中使用更新的标准)