假设从std :: vector读取大量值的循环是我程序中的瓶颈,有人建议我更改
void f(std::vector<int> v)
{
...
while (...)
{
...
int x = v[i] + v[j]
...
}
}
Run Code Online (Sandbox Code Playgroud)
至
void f(std::vector<int> v)
{
int* p_v = &v[0];
...
while (...)
{
...
int x = p_v[i] + p_v[j]
...
}
}
Run Code Online (Sandbox Code Playgroud)
这会通过绕过[]运算符来实际提高性能吗?
非常自我解释.这是导致'new vector'行上的SIGABRT的方法:
vector<string> * Task::arguments() {
vector<string> *args = new vector<string>(); // CAUSES SIGABRT
int count = sizeof(_arguments);
for (int x = 0; x < count; x++) {
string argument(_arguments[x]);
args->push_back(argument);
}
return args;
}
Run Code Online (Sandbox Code Playgroud)
请注意,在其他地方我称之为确切的行没有任何问题.以下是Task类中包含的列表:
#include <vector>
#include <unistd.h>
#include <string>
using namespace std;
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?
我目前正在尝试用std :: shared_ptr和std :: weak_ptr替换我的代码的某些部分.在很多部分我都有std ::的std :: weak_ptrs(以前是原始的ptrs),并使用std :: find来查找数组中的某个指针.这不适用于弱指针,因为它们由于各种原因不实现==运算符.我必须坚持使用std :: weak_ptr来避免循环依赖.我有什么选择,我应该回到使用原始指针而不是弱指针?
例
//_window is a shared_ptr that I want to find in a vector of weak_ptrs
WindowWeakPtrArray::iterator it = std::find(m_windows.begin(), m_windows.end(), _window);
Run Code Online (Sandbox Code Playgroud)
谢谢
我使用简单的向量push_back到类型A的对象并得到此错误,这是我的代码:
class A
{
public:
A(int a,int b,int c);
};
#include "A.h"
....
....
....
....
std::vector<A>* vec_objects = new std::vector<A>();
while(....some condition ...)
{
A a(1,2,3)
vec_objects->push_back(a);
}
Run Code Online (Sandbox Code Playgroud)
收到此错误:
c:\program files\microsoft visual studio 9.0\vc\include\xutility(3159) : error C2582: 'operator =' function is unavailable in 'A'
1> c:\program files\microsoft visual studio 9.0\vc\include\xutility(3187) : see reference to function template instantiation 'void std::_Fill<A*,_Ty>(_FwdIt,_FwdIt,const _Ty &)' being compiled
1> with
1> [
1> _Ty=A,
1> _FwdIt=A *
1> ]
1> c:\program files\microsoft visual studio …Run Code Online (Sandbox Code Playgroud) 有没有办法做到这一点:
std::vector<char[foo]> bar;
Run Code Online (Sandbox Code Playgroud)
我需要一个连续的数组,char[foo]但我不知道运行时的长度.我需要能够char[foo]动态添加块.
我需要内部数组完全正确的大小,所以如果foo是3:
[[1,2,3] [4,5,6] ...... [x,y,z]]
我可以自己实现,但不想重新发明轮子.
在下面的代码中,每次为第一个元素获取不同的地址std::vector v.为什么会这样?
#include <memory>
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v;
for (int i=0; i<10; ++i)
{
int b = i;
v.push_back(b);
std::cout << std::addressof(v[0]) << std::endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
0x603010
0x603030
0x603010
0x603010
0x603050
0x603050
0x603050
0x603050
0x603080
0x603080
Run Code Online (Sandbox Code Playgroud) 在我的C++项目中,我使用a vector来保存一堆structs,其中包含一些简单游戏的元素(即:tic-tac-toe,coordinates,xvs o等).即:
struct gameMove
{
int x;
int y;
int player;
int order;
};
Run Code Online (Sandbox Code Playgroud)
每次在单个游戏中,无论何时玩家进行移动(即:放置x或移动o),信息都存储在vector通道中push_back(),以创建"撤消"功能,该功能目前按预期工作.
在我的撤销/重做逻辑的某些部分,我使用的函数遍历vector,找到适当的元素,并直接返回指向该元素的指针.
它是否安全,只要我正确管理vector,访问它,将指向元素的所有指针清空vector,或者存在固有风险?我担心的是,如果扩展我计划做的游戏(即:对我正在进行的国际象棋游戏使用相同的代码),并且vector太大而需要自动重新分配,指针将会变得无效(即:整个列表被移动到一个可以适合所有元素的新的连续块),或者是否有某种类型的智能指针接口vector来完成同样的事情?
谢谢.
我有一个R :: NumericVector,我想知道是否可以在不使用c ++循环的情况下将其转换为std :: vector.
void someFunction(NumericMatrix mtx){
NumericVector rVec = mtx.row(0);
std::vector<int> sVec;
sVec = rVec; //<-- I wanna do something like this
}
Run Code Online (Sandbox Code Playgroud) 我有以下代码片段:
vector<shape*> triangle_ptrs;
for (auto x : triangles)
triangle_ptrs.push_back(&x);
Run Code Online (Sandbox Code Playgroud)
triangle是一个派生自shape类的类,它triangles是一个std::vector三角形:
std::vector<triangle> triangles;
Run Code Online (Sandbox Code Playgroud)
我需要保存三角形的地址,但是当我遍历集合时,它们的地址似乎是相同的.我该如何解决这个问题?
我正在为学校创建各种数字自动售货机,但遇到了问题。我创建了一个Items自动售货结构。然后,我创建了一个名为的结构Machine,其中包含一个vector<Items>。我想创建一个for循环,该循环遍历vector<Item>并显示项目,但出现以下错误:
C:\Users\Nate\Desktop>g++ structversion.cpp -o structversion.exe -std=c++11
structversion.cpp: In function 'int test(Machine)':
structversion.cpp:29:20: error: 'begin' was not declared in this scope
for (Item item : machine) {
^
structversion.cpp:29:20: note: suggested alternatives:
In file included from C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++/string:51:0,
from C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++/bits/locale_classes.h:40,
from C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++/bits/ios_base.h:41,
from C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++/ios:42,
from C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++/ostream:38,
from C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++/iostream:39,
from structversion.cpp:1:
C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++/bits/range_access.h:87:5: note: 'std::begin'
begin(_Tp (&__arr)[_Nm])
^
C:/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/5.1.0/include/c++/bits/range_access.h:87:5: note: 'std::begin'
structversion.cpp:29:20: error: 'end' was not declared in this scope
for (Item item : machine) { …Run Code Online (Sandbox Code Playgroud)