0

当我学习 C++ 时,他们警告我不要使用 STL。它是新的、有缺陷的、低效的。最近我发现自己为一个新项目创建了一个容器,并意识到这可能是NIH的一个案例,我应该尝试 STL <vector>。

不幸的是,它不起作用。

#include <stdio.h>
#include <stdlib.h>

#include <vector>

class test {
    public:
    int x;
};

int main(int argc,char *argv[]) {
    std::vector<test> obj;
    test *tmp=new test();
    tmp->x=42;
    obj.push_back(tmp);
    }

g++ 警告我 push_back 没有匹配的函数,并且 push_back 将 const value_type& 作为参数。我尝试了很多演员来强制这样做,但它拒绝让步。

我现在浪费了更多的时间来尝试以“正确”的方式来完成它,而不是编写另一个容器并对其进行调试。

如果这听起来像是愤怒和沮丧,那么你是有洞察力的。我已经发现了几个类似我的问题,但答案证明非常难以理解。如果这是一个火焰会飞的地方,我希望为此而敬酒。我已经在 stackoverflow 上潜伏了几年,我敢打赌,有人可以“像我五岁一样解释它”。

是否有单行咒语迫使演员工作?如果不是,这些向量应该如何使用?

4

4 回答 4

11

Lose the pointer

std::vector<test> obj;
test tmp;
tmp.x=42;
obj.push_back(tmp);

You have a vector of test not test* so I'm not sure why you tried to involve pointers. One of the massive advantages of the STL is that it allows you to avoid pointers, which as an experienced C++er, I'm sure you know are a major cause of bugs.

于 2013-08-31T19:41:20.457 回答
3

Do one of these 2 things

std::vector<test*> obj;
test *tmp=new test;
tmp->x=42;
obj.push_back(tmp);

Or

std::vector<test> obj;
test tmp;
tmp.x=42;
obj.push_back(tmp);

If you declare a vector of test objects, then push_back a test object. If you declare a vector of test pointers, then push_back a test *.

于 2013-08-31T19:44:23.073 回答
1

除了丢失@John(在我看来非常正确)建议的指针外,我还会在您的课程中添加一个 ctor test

class test { 
    int x;
public:
    test(int x) : x(x) {}
};

这可用于隐式转换,因此您也可以跳过tmp变量,留下如下内容:

std::vector<test> t;

t.push_back(42);

...并且编译器将使用 ctor 自动将其转换42为一个test对象,其x值设置为42.

如果您想防止意外将随机数转换int为 a test,您可以选择中途点。制作 ctor explicit,并在调用中显式转换为push_back

class test { 
    int x;
public:
    explicit test(int x) : x(x) {}
};

// ...

std::vector<test> t;

t.push_back(test(42));

哦,我可能应该提到另一个细节:假设您使用的是(相当)新的编译器,您可能想要使用emplace_back而不是push_back. 如果有机会,它将在适当位置创建新对象,而不是将其复制到向量中。test对于像您这样的小类(仅包含一个),它不会产生任何真正的区别int,但是对于复制成本很高的大类,差异可能很大。

于 2013-08-31T19:56:15.863 回答
1

不应将 C++ 指针存储在 std 集合中。您按照 John 的建议存储对象本身。使用原始指针会导致许多非常棘手的内存错误。
如果您的老师认为 STL 有问题,他可能已经这样做了。它真的很强大。如果您将大对象存储在集合中,STL 似乎效率低下,因为这些对象将被复制,这在时间和内存上都是昂贵的。因此,关于效率低下的信念也是错误的。诀窍是使用智能指针。这些使堆分配变得更加容易,并且与 STL 一起工作得很好。然后它是有效的,而且完全没有错误。写自己比以往任何时候都好得多。

于 2013-08-31T19:58:38.533 回答