如果我在C++中有一个指向向量的指针:
vector<int>* vecPtr;
Run Code Online (Sandbox Code Playgroud)
我想访问向量的一个元素,然后我可以通过去除向量来做到这一点:
int a = (*vecPtr)[i];
Run Code Online (Sandbox Code Playgroud)
但是这个解除引用会不会在堆栈上创建我的矢量副本?假设向量存储10000个int,是否会通过解除引用来复制vecPtr 10000 int?
谢谢!
我有几个std::vector,全长相同.我想对这些向量中的一个进行排序,并将相同的变换应用于所有其他向量.这样做有一个简洁的方法吗?(最好使用STL或Boost)?一些向量包含ints,其中一些包含std::strings.
伪代码:
std::vector<int> Index = { 3, 1, 2 };
std::vector<std::string> Values = { "Third", "First", "Second" };
Transformation = sort(Index);
Index is now { 1, 2, 3};
... magic happens as Transformation is applied to Values ...
Values are now { "First", "Second", "Third" };
Run Code Online (Sandbox Code Playgroud) 在我写自己之前,我会问你们所有人.
我正在寻找一个几乎完全像STL向量的C++类,但是将数据存储到堆栈中的数组中.某种类型的STL分配器类也可以工作,但我试图避免任何类型的堆,甚至是静态分配的每线程堆(尽管其中一个是我的第二选择).堆栈效率更高.
它需要几乎替代使用向量的当前代码.
对于我自己要写的东西,我在考虑这样的事情:
char buffer[4096];
stack_vector<match_item> matches(buffer, sizeof(buffer));
Run Code Online (Sandbox Code Playgroud)
或者类可以在内部分配缓冲区空间.然后它看起来像:
stack_vector<match_item, 256> matches;
Run Code Online (Sandbox Code Playgroud)
我认为如果空间不足,它会抛出std :: bad_alloc,尽管这不应该发生.
更新
使用Chromium的stack_container.h效果很好!
我之所以没想过这样做的原因是我总是忽略了STL集合构造函数的allocator对象参数.我已经使用了几次模板参数来做静态池,但是我从未见过代码或编写任何实际使用过对象参数的代码.我学到了新东西.很酷!
代码有点乱,由于某种原因,GCC强迫我将分配器声明为实际项而不是将其构造为vector的allocator参数.它来自这样的事情:
typedef std::pair< const char *, const char * > comp_list_item;
typedef std::vector< comp_list_item > comp_list_type;
comp_list_type match_list;
match_list.reserve(32);
Run Code Online (Sandbox Code Playgroud)
对此:
static const size_t comp_list_alloc_size = 128;
typedef std::pair< const char *, const char * > comp_list_item;
typedef StackAllocator< comp_list_item, comp_list_alloc_size > comp_list_alloc_type;
typedef std::vector< comp_list_item, comp_list_alloc_type > comp_list_type;
comp_list_alloc_type::Source match_list_buffer;
comp_list_alloc_type match_list_alloc( &match_list_buffer );
comp_list_type match_list( match_list_alloc );
match_list.reserve( comp_list_alloc_size ); …Run Code Online (Sandbox Code Playgroud) 通常,使用排序std::vector而不是a 更有效std::set.有没有人知道一个库类sorted_vector,它基本上有一个类似的接口std::set,但插入元素到排序的矢量(所以没有重复),使用二元搜索find元素等?
我知道写起来并不难,但最好不要浪费时间并使用现有的实现.
更新:使用排序向量而不是集合的原因是:如果您有数十万个小集合,每个集合只包含10个左右的成员,那么使用排序向量代替更高内存效率.
我今天跑了一个非常微妙的问题我希望得到你的意见.
考虑以下花园式共享体成语类:
struct S
{
S() : p_impl(new impl) {}
private:
struct impl;
boost::shared_ptr<impl> p_impl;
};
Run Code Online (Sandbox Code Playgroud)
当您尝试以下列方式将它们放入向量时,会出现这种乐趣:
std::vector<S> v(42);
Run Code Online (Sandbox Code Playgroud)
现在,至少使用MSVC 8,所有元素v共享同一个impl成员.实际上,导致这种情况的原因是vector构造函数:
template <typename T, typename A = ...>
class vector
{
vector(size_t n, const T& x = T(), const A& a = A());
...
};
Run Code Online (Sandbox Code Playgroud)
在这些场景中,只有一个S对象被默认构造,从中复制了它们的n元素vector.
现在,使用C++ 11,有rvalue引用.所以它不能像这样工作.如果a vector被构造为
std::vector<S> v(42);
Run Code Online (Sandbox Code Playgroud)
然后很可能,实现将选择默认构造n向量内的对象,因为复制构造可能不可用.在这种情况下,这将是一个突破性的变化.
我的问题是:
std::vector必须具有如上定义的构造函数,即.使用默认参数?特别是保证向量对象的条目被复制而不是默认构造?PS:请不要评论 …
vector从a获取键和值的列表(作为a )的最有效方法是unordered_map什么?
具体来说,假设有问题的地图是一个unordered_map<string, double>.然后我想把键作为a vector<string>,并将值作为a vector<double>.
unordered_map<string, double> um;
vector<string> vs = um.enum_keys();
vector<double> vd = um.enum_values();
Run Code Online (Sandbox Code Playgroud)
我可以遍历地图并收集结果,但是有更有效的方法吗?有一个方法也适用于常规地图会很好,因为我可能会切换到那个.
如果我有一个NxN矩阵
vector< vector<int> > A;
Run Code Online (Sandbox Code Playgroud)
我应该如何初始化它?
我试过没有成功:
A = new vector(dimension);
Run Code Online (Sandbox Code Playgroud)
既不是:
A = new vector(dimension,vector<int>(dimension));
Run Code Online (Sandbox Code Playgroud) 我有一个vector<data> info地方data被定义为:
struct data{
string word;
int number;
};
Run Code Online (Sandbox Code Playgroud)
我需要info按字符串的长度排序.有一种快速简单的方法吗?
我有一个包含49个数值的向量.我希望有一个7x7数字矩阵.
我可以使用某种方便的自动转换语句,还是必须将7个单独的列分配正确的向量子集分配给新的矩阵?我希望有一些类似于oposite的东西c(myMatrix),当然可以选择给出我想要的行数和/或列数.