我有两个向量,指向我的自定义类对象.
这两个向量中的指针不指向同一个对象,但存储在对象中的值是相同的.
我的自定义类结构是:
Class Item
{
string ItemId;
string ItemDescription;
float ItemPrice;
}
第一矢量(V1)具有n个条目,第二矢量(V2)具有m个条目(n> m).
我要执行两个操作:
如何以有效的方式做到这一点?
我有一个类,其成员是向量的向量.我想为这个类编写一个构造函数,它将一个向量的r值引用作为参数,并将其作为vector参数的单个元素向量移动到成员向量中.到目前为止,我有:
class AClass
{
std::vector<std::vector<int>> member;
public:
AClass(std::vector<int> &&vec) : member(1)
{
member[0] = std::vector<int>(std::move(vec));
}
}
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常,但我不确定std::move周围vec是否有必要.或者,如果std::vector我已经为我照顾了很多这个,那我的写法有点不同.
我在我的程序中使用了一个向量,如下所示:
vector<vector<string> > values;
values[0].push_back("test words");
Run Code Online (Sandbox Code Playgroud)
当我运行代码时,它显示"段错误"
然后我尝试gdb它,我得到了这个:
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000008
0x00000001000035be in std::vector<std::string, std::allocator<std::string> >::push_back (this=0x0, __x=@0x7fff5fbff330) at stl_vector.h:602
602 if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
Run Code Online (Sandbox Code Playgroud)
这里发生了什么 ?
我有一个std :: vector.我指定这个矢量
vec.assign(20000, 0);
Run Code Online (Sandbox Code Playgroud)
现在我有一个额外的数组,我想插入到向量中.但不仅仅是插入,更多的替换元素在向量中.
uint8_t a[] = {1,2,3,4,5,6,7,8};
Run Code Online (Sandbox Code Playgroud)
将该数组移动到位置x - x + 8上的向量中,而不分配新内存.
我尝试和工作的当然是
vec.insert(start, a, a+8);
Run Code Online (Sandbox Code Playgroud)
但是我在那里分配新的内存并且向量的大小发生变化,这是不应该发生的.是的,我可以删除,条目太多,但仍然有问题,我分配更多的内存.是否有可能只用向量的内容替换数组?像这样的Smth:
vec.replace(start, a, a+8);
Run Code Online (Sandbox Code Playgroud)
我想避免更换每个元素,因为我担心这可能需要太长时间.
你怎么看?有没有办法做到这一点?你以前也遇到过这个问题吗?你怎么修好它的?
类似问题:
#include <vector>
#include <iostream>
using namespace std;
int main() {
vector<vector<int> > vvi;
vvi.resize(1);
vvi[0].reserve(1);
vvi[0][0] = 1;
vector<int> vi = vvi[0];
cout << vi[0]; // cout << vvi[0][0]; works
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这给了我一个段错误,我不知道为什么.
假设以下基本向量:
std::vector<int> numbers;
numbers.push_back(0);
numbers.push_back(1);
numbers.push_back(2);
numbers.push_back(3);
Run Code Online (Sandbox Code Playgroud)
在0和1之间插入6个新数字的有效方法是什么?
这是我现在的方法,但我觉得它效率不高:
for (int new_number=0;new_number<6;new_number++) {
numbers.emplace(numbers.begin()+1+new_number,new_number);
}
Run Code Online (Sandbox Code Playgroud)
我不喜欢这种方法的原因是数字1-3必须被移动6次.有没有办法将这些数字移动一次而不是6次?然后我可以使用这个循环:
for (int new_number=0;new_number<6;new_number++) {
numbers[new_number+1]=new_number;
}
Run Code Online (Sandbox Code Playgroud)
这是我想要完成的:
转移前的矢量:
0 1 2 3
Run Code Online (Sandbox Code Playgroud)
转移后的矢量:
0 X X X X X X 1 2 3
Run Code Online (Sandbox Code Playgroud) 我有一个std::vector,我需要从libgcrypt获取其内容的哈希值.
我如何获得的内容std::vector<int-type> vec到gcry_md_hash_buffer(GCRY_MD_MD5, (void*)&digest, (void*)buffer, vec.size());这里buffer是data在vec?
我使用一个简单的代码:
std::vector < float > arr = { 3.42f, 6.45f, 53.43f };
float *elemPtr;
elemPtr = &arr[ 0 ];
std::cout << "elemPtr = " << *elemPtr << std::endl;
arr.push_back( 7.0f );
std::cout << "elemPtr = " << *elemPtr << std::endl;
Run Code Online (Sandbox Code Playgroud)
该代码产生以下输出:
elemPtr = 3.42
elemPtr = -6.25982e+18
Run Code Online (Sandbox Code Playgroud)
为什么在push_back之后会发生这种情况?我没有删除向量的第一个元素.它为什么会这样?
我使用Clang编译器(Xcode).
我有一个std::shared_ptr声明的deque有一个基类的deque(我们称之为Polygon),但我存储指向派生对象的指针(例如Triangle).我现在正在考虑将数据结构更改std::vector为使用向量确保相邻内存的事实但我在这里有几个问题:
1)即使物体尺寸不同,这是否可行?或者可能发生由于派生对象大于它们将在内存中重叠的基础对象?
2)存储std::shared_ptr我不会在内存中将它们完全放在一起只是指针是真的吗?还是我错了?
谢谢
我有两种将向量元素添加到向量的方法。
GUI_Vertices.emplace_back();
GUI_Vertices.back().pos.x = ((float)x / 400) - 1.f;
GUI_Vertices.back().pos.y = ((float)y / 300) - 1.f;
GUI_Vertices.back().texCoord.x = u;
GUI_Vertices.back().texCoord.y = v;
GUI_Vertices.back().color.r = m_Color.r / 128;
GUI_Vertices.back().color.g = m_Color.g / 128;
GUI_Vertices.back().color.b = m_Color.b / 128;
GUI_Vertices.back().color.a = m_Color.a / 128;
Run Code Online (Sandbox Code Playgroud)
上面的代码有效,但是我被迫向GUI_Vertices向量添加一个新元素。
Vertex NewVertex;
NewVertex.pos.x = ((float)x / 400) - 1.f;
NewVertex.pos.y = ((float)y / 300) - 1.f;
NewVertex.texCoord.x = u;
NewVertex.texCoord.y = v;
NewVertex.color.r = m_Color.r / 128;
NewVertex.color.g = m_Color.g / 128;
NewVertex.color.b = m_Color.b …Run Code Online (Sandbox Code Playgroud)