标签: stdvector

在四个std :: vector对象中选择具有最多元素的对象

我有四个std :: vector容器,它们都可能(或可能不)包含元素.我想确定哪些元素具有最多元素并随后使用它.

我尝试创建一个std :: map,它们各自的大小作为键,并将这些容器的引用作为值.然后我在每个向量的size()上应用std :: max来计算最大值并通过std :: map访问它.

显然,一旦在至少两个向量中存在相同数量的元素,这就会让我陷入困境.

谁能想到一个优雅的解决方案?

c++ algorithm stdvector

1
推荐指数
2
解决办法
290
查看次数

从方法返回对向量的引用并使用其公共成员

我有一个t_vec存储类实例的引用的向量Too.代码如下所示.在main,我有一个向量t_vec_2,其内存地址与B::t_vec.

但是当我尝试访问t_vec_2 [0] .val1时,它会出错val1 not declared.

你能指出出了什么问题吗?此外,如果您知道从方法返回矢量的更好方法,请告诉我!提前致谢.

class Too {      
      public:             
             Too();
             ~Too(){};
          int val1;
};

Too::Too(){
           val1 = 10;
           };


class B {
      public:
             vector<Too*> t_vec;
             Too*  t1;
             vector<Too*>& get_tvec();
             B(){t1 = new Too();};
             ~B(){delete t1;};
};

vector<Too*>& B::get_tvec(){
    t_vec.push_back(t1);
    return t_vec;
}

int main(){
    B b;
    b = B();
    vector<Too*>& t_vec_2 = b.get_tvec();

    // Getting error    
    std::cout << "\n val1 = " << t_vec_2[0].val1;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ stdvector

1
推荐指数
1
解决办法
550
查看次数

向向量添加元素时,如何知道要创建对象的副本?

我的LastQueryInfo lastQuery班上有一个叫做的对象.每次这个对象改变时,我都会将它添加到一个名为的向量中history.

最初,当我这样history.push_back(lastQuery)做时,我不知道会发生什么 - 矢量是否会制作对象的副本?或者是否会继续提及它?所以,如果以后我修改lastQuery,历史矢量中的所有对象(假设它们都是引用)将被修改?

经过一些测试,我发现history.push_back(lastQuery)确实会制作一个对象的副本,然后将其添加到矢量中.但是如果不做任何测试我怎么知道呢?我怎么知道C++什么时候要复制,什么时候要添加实际的对象?

c++ reference object stdvector

1
推荐指数
1
解决办法
1260
查看次数

这个继承自std :: vector的类声明有什么问题吗?

我意识到有更好的编译器,但我更喜欢坚持使用vc6,每隔一段时间,我发现奇怪的吸虫,并想知道这个是本地化我的安装或每个人的.

请记住,有问题的编译器是:
Microsoft(R)32位C/C++优化编译器版本12.00.8168 for 80x86
(链接器等不相关,因为这个问题似乎不涉及它们)

试图声明一个继承自std :: vector的类,它可以正常工作,除非您还尝试特定于定义第二个模板参数:

10: class foo : public std::vector<LPTSTR,std::allocator<LPTSTR>>
11: {
12:   public:
13:   foo();
14:   ~foo();
15: };
Run Code Online (Sandbox Code Playgroud)

不编译并给出该错误:C:\ FOO\foo.h中(10):错误C2143:语法错误:缺少 '>' 前 '{'

现在,真正的问题是,为什么这是合法的:

10: class foo : public std::vector<LPTSTR,std::allocator<LPTSTR>>> 
11: {
12:   public:
13:   foo();
14:   ~foo();
15: };
Run Code Online (Sandbox Code Playgroud)

注意第>10行末尾的额外内容......我想知道的是:

  1. 没有我做错了什么?
  2. 这只发生在我的安装?
  3. 我应该避免使用这种解决方法,因为它可能会在某种程度上导致问题吗?

我试图尽可能多地研究这个问题,但是大多数程序员都知道在线搜索并不是那么容易,因为搜索引擎似乎远没有限制甚至没有正规表达式搜索它会成为命中注定和/或人气竞赛(是一个受欢迎的主题,足以在谷歌上排名等).

我提前感谢你对这个问题的提示(甚至没有提示).我试着回答别人的问题,即使这对我来说似乎很荒谬,并且试着记住知识总是从缺乏知识开始.

c++ class-design compiler-errors stdvector visual-studio

1
推荐指数
1
解决办法
166
查看次数

将std :: vector与类元素一起使用时内存泄漏

我有以下问题:

当我使用std :: vector和内置函数时,我没有得到内存,但如果我使用类,我会得到内存泄漏.为了显示:

//No leak
std::vector<double>* vecPtr1=new std::vector<double>();
//add some elements
delete vecPtr1;

//Leaks some memory but not all
std::vector<SomeClass>* vecPtr2=new std::vector<SomeClass>();
//add some elements with vecPtr2->push_back(SomeClass());
delete vecPtr2;
Run Code Online (Sandbox Code Playgroud)

据我所知,删除应该调用std :: vector的析构函数,它应该依次调用SomeClass的析构函数 - >无泄漏.我已经投入了一些思考和测试,如果我在这样的范围内使用std :: vector会发生同样的行为:

{
  std::vector<SomeClass> vector;
  //add elements as before
}
//memory is still used here
Run Code Online (Sandbox Code Playgroud)

我在Ubuntu 11.10下使用gcc 4.6.1.在我的库中有什么不对,或者我对std :: vector如何破坏元素有误解?

为了澄清我的SomeClass的完整代码替换为std :: pair(是的,我知道有些部分被黑了,但它只是一个例子):

#include <iostream>
#include <vector>
#include <utility>

int main()
{
    std::string inString;
    std::cout<<"Started"<<std::endl;
    //wait
    std::cin>>inString;
    {
        //assign vector
        std::vector<std::pair<std::string,unsigned int> > vec=std::vector<std::pair<std::string,unsigned int> …
Run Code Online (Sandbox Code Playgroud)

c++ memory-leaks stdvector

1
推荐指数
1
解决办法
6886
查看次数

如何通过指针访问向量?

我想vector使用指针插入新元素我有以下示例代码:

struct info {
    string Name;
    int places;  // i will use the binary value to identfy the visited places example 29 is 100101
                 // this means he visited three places (London,LA,Rome)  
    vector<int> times; // will represent the visiting time,e.g. 1,2,5 means london 1 time, LA
                       // twice and Rome five times
};

map<string,vector<info> *> log;
Run Code Online (Sandbox Code Playgroud)

Peaple来自不同的城市,我将检查城市是否存在,只需将新人添加到其中vector,否则创建一个新的地图对象:

vector<info> tp;
info tmp;
if(log.size()==0|| log.count(city)==0) //empty or not exist 
{
    tp.push_back(tmp);
    vector<info>* ss = new vector<info>;
    ss=&(tp);
    // …
Run Code Online (Sandbox Code Playgroud)

c++ pointers stdmap stdvector

1
推荐指数
1
解决办法
160
查看次数

向量中包含的对象有什么要求

在Exceptional C++中,Herb Sutter写道auto_ptr:

问题是auto_ptr不能完全满足您可以放入容器的类型的要求,因为auto_ptrs的副本不等同.

这本书是关于C++ 03编写的,我想知道这是否仍然有效,因为这段代码似乎在GCC 4.7.1下完美编译:

#include <vector>

struct Foo
{
    Foo() { }
    Foo( Foo&& ) { }
    Foo( Foo& ) = delete;
    Foo& operator= (Foo&&) { return *this; }
    Foo& operator= (Foo&) = delete;
};

int main()
{
    std::vector<Foo> bar;
    bar.push_back(Foo());
}
Run Code Online (Sandbox Code Playgroud)

但是接受可移动但不可复制的对象也可以是GCC扩展.我不确定.std::vector对象的要求是什么?

c++ vector stdvector c++11

1
推荐指数
1
解决办法
134
查看次数

为什么矢量保证不是连续的?(或者是吗?)

我知道std::vector元素在内存中保证是连续的.

那么为什么你不能指望包含其他向量的向量使总集合连续?

该向量应该保证其封闭项的连续内存布局,如果这些外壳也是向量,那么我希望最顶层向量的全部内容在连续的内存中.

但是在这个问题上似乎存在一些关于这是否属实的争论.一个人可以安全地依赖它吗?有些人似乎走出自己的方式来实现这一目标,而我认为这是保证.

c++ stdvector

1
推荐指数
1
解决办法
550
查看次数

尽管索引容量不足,但vector.at()仍会出现扼流圈

我正在使用Debian 7.0.0下的CodeBlocks 10.05开发一个C++应用程序.

因此我为一个向量分配空间.

std::vector<double> dpMeanUnnormalizedRef;
dpMeanUnnormalizedRef.reserve(expectedUpperLimit);
Run Code Online (Sandbox Code Playgroud)

然后我尝试添加一个值.不幸的是,我需要添加值的索引不是顺序的,所以我不能使用push.我第一次尝试添加元素时,调用如下.

dpMeanUnnormalizedRef.at(index)=doubleVar;
Run Code Online (Sandbox Code Playgroud)

此时,大小为0,容量为621,而索引的值为0.然而,此调用导致程序抛出超出范围的异常.

c++ std stdvector

1
推荐指数
1
解决办法
72
查看次数

gdb:<错误读取变量>与c ++向量

我在访问std向量的内存时遇到问题.

我首先定义一个struct(在头文件中):

typedef struct Systems {
//  other variables...
    vector <double>  sum;
} System;
Run Code Online (Sandbox Code Playgroud)

我需要一个系统集合,每个向量和必须包含num double,所以,在main中,我写道:

System * system;
system = (System*)malloc(DIM_ENSEMBLE*sizeof(System));
for (i =0; i< DIM_ENSEMBLE; i++) {
//...
system[i].part_sum.resize(num);
//...
}
Run Code Online (Sandbox Code Playgroud)

从我这一点开始使用

System[0].part_sum[0]
Run Code Online (Sandbox Code Playgroud)

初始化向量我收到一个分段错误程序.

如果在gdb我尝试

(gdb) print system[0].part_sum[0]
Run Code Online (Sandbox Code Playgroud)

我明白了:

$2 = (double &) @0x200000003: <error reading variable>
Run Code Online (Sandbox Code Playgroud)

我使用reserve或allocator而不是resize获得相同的错误.我还检查了矢量的容量

cout << system[0].part_sum.capacity();
Run Code Online (Sandbox Code Playgroud)

我播种了很多空间......

怎么了?这是内存管理的问题吗?

一个.

c++ gdb memory-management stdvector

1
推荐指数
1
解决办法
5892
查看次数