小编jha*_*a-G的帖子

emplace_back不使用std :: vector <std :: map <int,int >>

我试图做emplace_back一个std::vector<std::map<int, int>>,但找不到正确的语法来做到这一点.

#include<map>
#include<vector>

int main()
{
    std::vector<std::map<int, int>> v;
    std::map<int,int> a {{1,2}};

    v.push_back({{1,2}});

    v.emplace_back({1,2});    // error
    v.emplace_back({{1,2}});  // error
    v.emplace_back(({1,2}));  // error
}
Run Code Online (Sandbox Code Playgroud)

push_back在这里工作,但不是emplace_back.我怎样才能emplace_back工作?

c++ c++11

25
推荐指数
2
解决办法
3504
查看次数

std :: tuple用于不可复制和不可移动的对象

我有一个复制和移动ctor删除的课程.

struct A
{
    A(int a):data(a){}
    ~A(){ std::cout << "~A()" << this << " : " << data << std::endl; }

    A(A const &obj) = delete;
    A(A &&obj) = delete;

    friend std::ostream & operator << ( std::ostream & out , A const & obj);

    int data;
};
Run Code Online (Sandbox Code Playgroud)

我想用这个类的对象创建一个元组.但以下不编译:

auto p = std::tuple<A,A>(A{10},A{20}); 
Run Code Online (Sandbox Code Playgroud)

在另一方面,下面编译,但给出了一个惊人的输出.

int main() {
    auto q = std::tuple<A&&,A&&>(A{100},A{200});
    std::cout << "q created\n";
}
Run Code Online (Sandbox Code Playgroud)

产量

~A()0x22fe10 : 100
~A()0x22fe30 : 200
q created
Run Code Online (Sandbox Code Playgroud)

这意味着一旦元组构造线结束,就会调用对象的dtor.那么,被毁物体元组的意义何在?

c++ tuples c++11

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

C++:std :: vector中的push_back迭代它

以下代码片段提供了非常奇怪的输出.我期待溢出(Python给出一个MemoryError)

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> a{1,2,3};

    for( auto const & item : a)
        a.push_back(item);


    for( auto const & item : a)
        std::cout<<item<<',';

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

产量:1,2,3,1,0,3,

我该如何解释这个结果?

如果你在Python中做类似的事情,它会给出内存错误.

>>> a = range(0,20)
>>> for i in a:
    a.append(i)



Traceback (most recent call last):
  File "<pyshell#3>", line 2, in <module>
    a.append(i)
MemoryError

>>> 
Run Code Online (Sandbox Code Playgroud)

我想到了这个问题,因为上面编写代码的方式被认为是绑定安全的.并且对于绑定的安全容器不应该在生长/收缩期间foreach type iteration.所以,这是一个漏洞的抽象.

有没有办法可以包装这个foreach循环,以便在循环体中不允许任何导致大小修改/重新分配的操作.

c++ python vector leaky-abstraction

5
推荐指数
2
解决办法
1878
查看次数

Python类中的类属性阴影

我正在学习这个,这是为了理解类的属性.但与以下代码片段的输出混淆.

class A:
    aliases = None
    name = None

    def __init__(self,name):
        self.name = name
        self.aliases = set([name])

    def add_aliases(self,a):
        self.aliases.add(a)

    def __repr__(self):
        return str(self.name) + str(self.aliases)

arr = []
for i in range(3):
    arr.append(A(i))
    arr[-1].add_aliases(i+1)

for item in arr:
    print item

A.aliases = set([]) ##Modify the static element of class
for item in arr:
    print item  
Run Code Online (Sandbox Code Playgroud)

Python解释器:2.7.9

输出是

0set([0, 1])
1set([1, 2])
2set([2, 3])
0set([0, 1])
1set([1, 2])
2set([2, 3])
Run Code Online (Sandbox Code Playgroud)

我期待这样的东西作为输出.

0set([2, 3])
1set([2, 3])
2set([2, …
Run Code Online (Sandbox Code Playgroud)

python

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

如何明确提及 std::vector 的构造函数?

http://en.cppreference.com/w/cpp/container/vector/vector列出了所有向量。但是以下两个构造函数会导致编译问题。通常,在呼叫一个的过程中,我们会结束呼叫另一个。

vector( size_type count,
                 const T& value,
                 const Allocator& alloc = Allocator());
vector( std::initializer_list<T> init,
        const Allocator& alloc = Allocator() );
Run Code Online (Sandbox Code Playgroud)

通常归结为将 {} 更改为 () 或反之亦然,以使事情正常进行。

有没有办法让ctor的选择变得清晰?不用担心括号。

PS-如果你放了正确的括号,下面的代码就可以完美工作。

vector{elem1, elem2}; // Initializer list version
vector(vector_size, elem); // A vector of size `vector_size` all the items having value = elem
Run Code Online (Sandbox Code Playgroud)

c++ vector c++11

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

一个班轮使用std :: tie进行交换

在python中我们可以将两个变量交换为

>>> a , b = b , a
Run Code Online (Sandbox Code Playgroud)

我们可以在C++ 11中进行类似的交换

void swap(int &a,int &b)
{
    std::tie(a,b) = std::make_tuple(b,a);
}
Run Code Online (Sandbox Code Playgroud)

以上工作正常,在O3生成类似的装配

void swap(int &a,int &b)
{
    int c = a;
    a = b;
    b = c;
}
Run Code Online (Sandbox Code Playgroud)

但我的问题是它符合标准还是我遗漏了什么?或者像侥幸......

a = (a+b) - (b=a);
Run Code Online (Sandbox Code Playgroud)

哪个有序列点问题.

c++ c++11

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

将多字节ASCII文字分配给枚举值

可以将ASCII文本(不能将其称为字符串)分配给enum值,如下所示:

#include <iostream>
// Macro to handle BIG/LITTLE ENDIAN
// Endianness is suppoesed to handled in this macro
#define TEMP(X) X

enum t
{
    XX = 'AA', // 0x4141  or  0100 0001 0100 0001
};

int main()
{
    std::cout<<XX<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)

0x4141在这种情况下,编译器会编译它并在编译时生成一个Hexa-decimal常量.它确实生成一个编译警告:

main.cpp:9:14: warning: multi-character character constant [-Wmultichar]
     XX = 'AA', // 0x4141  or  0100 0001 0100 0001
Run Code Online (Sandbox Code Playgroud)

我的问题是,我们可以避免这种警告吗?

或者我们可以编写一个更优雅的代码来实现类似的结果,可能使用模板和constexpr?

我正在寻找一种便携式替代方案,这样我就可以在不影响核心逻辑的情况下将其作为重构的一部分.

c++ enums user-defined-literals constexpr

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

使用std :: function模板替换失败

我试图将回调函数作为函数参数传递.但是在以下代码中获取模板替换失败错误.不确定为什么模板替换失败.

#include<iostream>
#include <map>
#include <tuple>
#include <functional>

template<typename A,typename B>
void myfun(std::map<A,B> & mm, std::function<std::tuple<A,B>(void)> fn)
{
    A key;
    B val;
    std::tie(key,val) = fn();
    mm[key] = val;
}

std::tuple<std::string,int> fun()
{
    return std::make_tuple(std::string("hi"),1);
}

int main()
{
    std::map<std::string,int> gg;
#if 0
        //fixed version
        std::function<std::tuple<std::string,int>(void)> yy = fun;//fixed
        myfun(gg,yy);//fixed
#else
        // error causing code
        myfun(gg,fun);
#endif
}
Run Code Online (Sandbox Code Playgroud)

错误如下

main.cpp:8:6: note:   template argument deduction/substitution failed:

main.cpp:25:17: note:   mismatched types 'std::function<std::tuple<_T1, _T2>()>' and 'std::tuple<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, int> (*)()'

     myfun(gg,fun);
Run Code Online (Sandbox Code Playgroud)

c++ c++11

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