为什么会崩溃?我确实发现malloc()没有调用构造函数,所以我手动调用它们,但它仍然崩溃,我不明白为什么.
PS.我知道std :: vector和new []存在.不要告诉我使用vectors/new []作为答案.
struct MyStruct {
vector<int> list;
};
void make_crash(){
MyStruct *array = (MyStruct *)malloc(100*sizeof(MyStruct));
MyStruct element; // initialize element here since malloc() doesnt do it.
array[0] = element; // copy, everything should be alright?
array[0].list.push_back(1337); // nope, BANG!
// The above line makes these:
// First-chance exception at 0x7c970441 in test.exe: 0xC0000005: Access violation reading location 0xbaadf005.
// First-chance exception at 0x00401cd0 in test.exe: 0xC0000005: Access violation reading location 0xbaadf00d.
// Unhandled exception at 0x00401cd0 …Run Code Online (Sandbox Code Playgroud) 将字符串向量保存到磁盘不能按预期工作.我看到该文件已创建但有0个字节且没有条目.注意:我在Xcode(v4.3.3)上的MAC OS上编译C++代码.
向量和字符串的声明:
vector<string>taskVector;
string newTaskEntry;
Run Code Online (Sandbox Code Playgroud)
这是我在程序运行时向数组添加新字符串的方法:
taskVector.push_back(newTaskEntry);
Run Code Online (Sandbox Code Playgroud)
当用户退出程序时,我这样做:
fstream file;
file.open("data.txt", ios::out | ios::trunc);
for (int i = 0; i > taskVector.size(); i++) {
file.write(taskVector[i].c_str(), taskVector[i].length());
file.close();
Run Code Online (Sandbox Code Playgroud)
知道为什么我没有看到任何条目吗?其次,当我能够将内容保存到磁盘时,您能否给我一个提示如何读回数据?
我有std::vector<int> around,我需要从位置X开始更新(/覆盖)N个值.
想象一下包含整个房间顶点的顶点列表.
随机地移动椅子,您只需更新属于椅子的那些顶点,因此您需要更新整个房间顶点列表中的一组椅子顶点.
伪代码:
void CVertexBuffer::Update(int iOffset, const std::vector<tVertex>& vVerticesList)
{
// Update VAO
...
//
// Update m_vVertices (holding current vertices list)
// with vVerticesList (holding updated vertices data )
// starting at position iOffset
// The size of m_vVertices never changes
//
// The Dumb way ( just for pseudocoding )
for(int a = iOffset; a < vVerticesList.size(); a++)
{
m_vVertices[a] = vVerticesList[a-iOffset];
}
}
Run Code Online (Sandbox Code Playgroud)
我可以用std::vector它来做这件事吗?
我开始写一个词法分析器,我做了以下文件来测试到目前为止所做的一切都运行正常:
Main.cpp的
#include <iostream>
#include "Lexer.h"
#include "Token.h"
int main(void)
{
std::string str(""); // I'll use this to test expressions
Lexer lexer(str);
std::vector<Token> tokens = lexer.lex();
for(auto it = tokens.begin(); it != tokens.end(); ++it)
{
std::string str;
switch(it->type)
{
case TokenType::_EOF:
str = "EOF";
break;
case TokenType::ERROR:
str = "ERROR";
break;
case TokenType::SEMICOLON:
str = "SEMICOLON";
break;
case TokenType::PLUS:
str = "PLUS";
break;
case TokenType::LESS_THAN:
str = "LESS_THAN";
break;
case TokenType::GREATER_THAN:
str = "GREATER_THAN";
break;
case TokenType::INT:
str = "INT"; …Run Code Online (Sandbox Code Playgroud) 为什么这段代码不能从向量中删除所有元素?谢谢!
for (int i = 0; i < vec.size(); i++)
vec.erase(vec.begin());
Run Code Online (Sandbox Code Playgroud) 我有配置,我需要设置到某种容器我尝试设置为std :: vector但我在两种方式获得编译错误:
std::vector<std::string> ConfigVec= new std::vector<std::string>();
ConfigVec->at(0).append("00000\
11111\
00000");
ConfigVec->at(1) = "11111\
00000\
00000";
Run Code Online (Sandbox Code Playgroud)
没有很多std :: string声明,最简单的方法是什么
有没有直接的方法来查找std::vector容器中是否存在某组值(模式)?
假设我有这个数据容器:
std::vector<int> data { 0x00, 0xff, 0x00, 0x11, 0x12, 0x13, 0x14, 0x15 };
Run Code Online (Sandbox Code Playgroud)
而这个模式使用另一个std::vector容器描述:
std::vector<int> pattern { 0x00, 0xff, 0x00 };
Run Code Online (Sandbox Code Playgroud)
我想要:
一个布尔值,表示模式的存在.
最终,模式开始的索引.
我需要在添加新元素之前检查c ++向量中是否已存在具有特定值的元素(以避免重复)。
我检查了所有内容,并且该解决方案(下面的简化代码)似乎是最有效的,如果它确实起作用的话。
我遇到的问题特别是与此行:
“ if(std :: find(positions.begin(),positions.end(),pos)!= positions.end())”,
这给了我库内部的编译错误,说“二进制表达式的无效操作数('position'和'const position')”。
我知道我是C ++的新手,如果这是一个愚蠢的问题,我感到抱歉,但是有人可以告诉我我在做什么错吗?
值是结构的事实吗?它与值与指针/引用有关系吗(我怀疑是这样)?
struct position
{
int column;
int row;
};
int main ()
{
std::vector<position> positions = {{0,0}, {0,1}, {0,2}, {1,0}, {1,1}, {1,2}};
position pos = {2,1};
if(std::find(positions.begin(), positions.end(), pos) != positions.end())
{
positions.push_back(pos);
}
else
{
std::cout << "Value is already present" << std::endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我一无所知,并且真的坚持下去,这阻碍了我推进项目。
有人知道我在做什么错还是应该怎么做?
非常感谢!
在我的应用程序的结构中,一个对象具有一个向量是另一个向量的子集是有意义的。我的意思是说,较小的存储包含在较大的存储中。
这在C ++中可能吗?我保证这两个向量都不会被调整大小,并且我可能可以做到这一点,以使子向量在包含向量之前被破坏。
最初,我认为创建从迭代器到大向量的子向量可以解决问题,但这会产生一个副本。我真的想要重定向裸指针。
我正在尝试更改向量的每个元素,但是由于对consts 的某些混淆,我的代码无法编译。这是一个大大简化的示例(我省略了向量的初始化):
std::vector<int> test;
for (auto iter = test.cbegin(); iter != test.cend(); ++iter)
{
int v = *iter; // gets the correct element
*iter = v * 2; // compile error
}
Run Code Online (Sandbox Code Playgroud)
编译器错误为“'iter':您无法分配给const变量”。如图所示,使用迭代器修改单个元素的正确方法是什么?