昨天晚上我使用std :: vector进行工作,这个问题突然出现在我脑海中:矢量如何提供随机访问?
我试图查看代码,但没有成功.任何人都可以提供一些指示吗?
谢谢,阿伦
我想要一个有效的方法来实现已排序的向量与另一个有序向量的就地联合.通过inplace,我的意思是算法不应该创建一个全新的向量或其他存储来存储联合,即使是暂时的.相反,第一个矢量应该简单地增加新元素的数量.
就像是:
void inplace_union(vector & A, const vector & B);
Run Code Online (Sandbox Code Playgroud)
其后,A包含A联合B的 所有元素并进行排序.
std::set_union在<algorithm>不会工作,因为它会覆盖它的目的地,这将是一个.
此外,这可以通过两个向量只通过一次吗?
编辑:是的元素都一个和乙方应只在A.出现一次
我目前正在为C++开发一个图形库,现在卡在运行时调试模式中出现断言错误的位置.我也在这里看了一些关于SO的问题,但没有一个问题和答案引导我找到解决方案.在一些论坛中阅读后,我发现这个错误的发生是因为一旦矢量内容发生变化,迭代器就会失效.(例如在使用时erase())但是正如你在我的代码中看到的那样,我不是在修改向量,只是迭代.
错误出现在我标记的行中//ASSERTION.奇怪的是,neighbor_it它并没有指向第一个对象,(*vertex_it)->neighbors(而是指向0xfeeefeee.通过代码调试时,我可以清楚地看到neighbors-vector包含至少一个项目.不应该neighbor_it指向此向量中的第一个对象?
有关详细信息:m_vertices是图形中所有顶点的向量,并vertex::neighbors()返回边向量(其具有指向邻居/目标顶点的指针).在这个方法中,我想删除指向某个顶点的所有边.如果找到并删除了相应边,则返回true;如果没有指向边,则返回false p_vertex.
bool graph::remove_edges_pointing_to( vertex* p_vertex )
{
bool res = false;
std::vector<vertex*>::iterator vertex_it = m_vertices.begin();
// iterate through all vertices
while( vertex_it != m_vertices.end() )
{
// iterator on first element of neighbors of vertex
std::vector<edge*>::iterator neighbor_it = (*vertex_it)->neighbors().begin();
// iterate through all successors of each vertex
while( neighbor_it != (*vertex_it)->neighbors().end() ) //ASSERTION
{
if( (*neighbor_it)->dest() == p_vertex )
{ …Run Code Online (Sandbox Code Playgroud) 此缓冲区应包含相等长度的槽(本例中为3个)(本例中为20个)
缓冲区必须具有连续的内存,以便可以以非const方式传递给C函数.
const int slot_size = 20;
std::vector<char> vbuffer;
Run Code Online (Sandbox Code Playgroud)
此函数接受一个字符串,复制到所需大小的临时缓冲区,然后将其复制到 vbuffer
void prepBuffer( const std::string& s)
{
std::vector<char> temp(slot_size);
std::copy(s.c_str(), s.c_str() + s.length() + 1, temp.begin());
vbuffer.insert(vbuffer.end(), temp.begin(), temp.end());
}
Run Code Online (Sandbox Code Playgroud)
测试功能
int main()
{
vbuffer.reserve(60);
prepBuffer( "Argentina");
prepBuffer( "Herzegovina");
prepBuffer( "Zambia");
cout << &vbuffer[0] << endl;
cout << &vbuffer[20] << endl;
cout << &vbuffer[40] << endl;
}
Run Code Online (Sandbox Code Playgroud)
题.我的prepBuffer函数中有很多字符串复制.我正在寻找一种更好的方法来填充vbuffer最小的复制
编辑
插槽的大小在程序的其他地方确定.但是在编译时并不知道.
编辑
根据我接受的答案,我已经确定了这个版本
void prepBuffer(const std::string& s)
{
assert(s.size() < slot_size );
vbuffer.insert(vbuffer.end(), s.begin(), s.end());
vbuffer.insert(vbuffer.end(), …Run Code Online (Sandbox Code Playgroud) 在运行时,可以确定一个vector?的大小?
例如
输入:25 //显示矢量大小
code :
int N ;
cin << N ;
vector <int> data[N];
Run Code Online (Sandbox Code Playgroud) 我试图在std :: vector上使用std :: cound,如下所示.
int count = std::count( stdVector.begin(), stdVector.end(), "element" );
Run Code Online (Sandbox Code Playgroud)
在Windows上,它提供以下编译器错误.
error C4244: 'initializing' : conversion from '__int64' to 'int', possible loss of data
如果我更改代码如下,Windows编译器不会出现.
auto count = std::count( stdVector.begin(), stdVector.end(), "element" );
Run Code Online (Sandbox Code Playgroud)
但是现在我在linux上面临以下错误以进行上述更改.
error: ISO C++ forbids declaration of 'count' with no type
我将如何使用std::count哪个将在平台上构建而没有任何错误?
当添加大量元素时,System.Collections.Generic.List<T>它运行缓慢,因为当nums增加容量时,它必须复制所有元素.在C++中,这是固定的vector.reserve(n).我怎么能在C#中做到这一点?
我通常会传递一个包含原始指针的向量,如下所示:
someFunc(const std::vector<MyClass*>& classList){..}
Run Code Online (Sandbox Code Playgroud)
我想知道你是否可以像这样对unique_ptr做同样的事情:
someFunc(const std::vector<std::unique_ptr<MyClass>>& classList){..}
Run Code Online (Sandbox Code Playgroud)
?这是否意味着同样的事情?,即只读.
我有一个集合定义为 -
using Parameters = std::vector<int>;
using Group = std::pair<std::string, Parameters>;
std::vector<Group> inputs;
Run Code Online (Sandbox Code Playgroud)
我的意图是使用像这样的陈述
inputs.push_back(group0 /*What goes in here ?*/);
inputs.push_back(group1 /*What goes in here ?*/);
Run Code Online (Sandbox Code Playgroud)
如何初始化group0和group1使用初始化列表?像这样的代码似乎不起作用
inputs.push_back(std::make_pair("group0", {1, 2, 3, 4}));
Run Code Online (Sandbox Code Playgroud)
编辑:有是矢量,对初始化已经存在的问题,但我看不出任何地方second的std::pair又是一个集合.
我有一个元素的向量.我想使用匹配特定条件的此向量元素填充集合.我可以使用一行,或以比下面更简洁的方式执行此操作吗?
// given vector<int> v
set<int> s;
for (const int& i : v)
{
if (/* some condition on i*/)
s.insert(i);
}
Run Code Online (Sandbox Code Playgroud)
例如,以下内容:
// given vector<int> v
set<int> s;
s.insert(v.filter(/* lambda here*/));
Run Code Online (Sandbox Code Playgroud)
不言而喻,出于性能原因,v.filter方法应返回迭代器,而不是单独的填充向量.