javascript

java

python

c#

android

node.js

reactjs

c++

php

html

jquery

css

git

.net

ios

ruby-on-rails

sql

c

string

ruby

c ++-一种将list <T>转换为vector <T>的衬里

是否有单线将list<T>转换为vector<T>

谷歌搜索返回了很多结果,这些结果需要人工进行冗长的转换,这让我感到恶心。 我们是否应该花那么大的麻烦去做像列表到矢量转换这样简单的事情?

trans by 2019-11-16T18:36:14Z

有没有一种很好的方法来将std :: minmax(a,b)分配给std :: tie(a,b)?

std::tie(a, b) = std::minmax(a, b);

我认为这是直观的代码。 干净易懂。 太糟糕了,它无法正常工作,因为if (a >= b) { std::swap(a, b); }if (a >= b) { std::swap(a, b); }模板。因此,如果在auto& a, auto& b内部交换值,则一个分配将覆盖另一个值:

auto[a, b] = std::make_pair(7, 5);

std::tie(a, b) = std::minmax(a, b);

std::cout << "a: " << a << ", b: " << b << '\n';

a:5,b:5

这里的预期输出是if (a >= b) { std::swap(a, b); }


我认为这很重要,因为实现转换功能以将功能应用到某些范围需要直观的lambda声明。 例如:

std::vector<int> v{ 0, 1, 0, 2, 0 };
std::vector<int> u{ 1, 0, 1, 0, 1 };

perform(v.begin(), v.end(), u.begin(), [](auto& a, auto& b){ 
    std::tie(a, b) = std::minmax(a, b);    
}); 

//v would be == {0, 0, 0, 0, 0}
//u would be == {1, 1, 1, 2, 1}

我发现的一种解决方案是在if (a >= b) { std::swap(a, b); }上显式构造if (a >= b) { std::swap(a, b); }而不使用任何引用限定符来强制执行副本:

std::tie(a, b) = std::tuple<int, int>(std::minmax(a, b)); 

但是,这种if (a >= b) { std::swap(a, b); }的冗余似乎很糟糕,尤其是在之前说过auto& a, auto& b时。


有没有一种不错的,简短的方法来执行此作业? 可能这是错误的方向,只是说if (a >= b) { std::swap(a, b); }是最好的方法吗?

trans by 2019-11-16T06:14:48Z

可以假设STL向量存储始终是连续的吗?

如果您有一个已调整大小的STL向量,是否可以安全地获取元素0的地址并假定其余向量将在内存中跟随?

例如

vector<char> vc(100);
// do some stuff with vc
vc.resize(200);
char* p = &vc[0];
// do stuff with *p
trans by 2019-11-15T00:29:21Z

C ++-std :: string :: c_str()和临时

以下C ++代码格式正确吗:

void consumer(char const* p)
{
  std::printf("%s", p);
}

std::string random_string_generator()
{
  // returns a random std::string object
}

consumer(random_string_generator().c_str());

我遇到的问题是,在创建临时std :: string对象并采用c_str()指针后,没有什么可以防止std :: string对象被破坏(或者我错了吗?)。 即使代码一切正常,您能否将我指向标准? 当我使用g ++进行测试时,它确实可以工作。

trans by 2019-11-14T22:17:47Z

c ++-在一个s中合并多个set元素

我想知道是否有任何标准库或增强工具可以轻松地将多个集合的内容合并为一个集合。

就我而言,我有一些要合并的整数。

trans by 2019-11-13T06:46:49Z

C ++-std :: transform()和toupper(),没有匹配的函数

我试过这个问题的代码C ++ std :: transform()和toupper()..为什么会失败?

#include <iostream>
#include <algorithm>

int main() {
  std::string s="hello";
  std::string out;
  std::transform(s.begin(), s.end(), std::back_inserter(out), std::toupper);
  std::cout << "hello in upper case: " << out << std::endl;
}

从理论上讲,它应该是Josuttis的书中的例子之一,但它并不能编译[http://ideone.com/aYnfv。]。

为什么GCC抱怨:

no matching function for call to ‘transform(
    __gnu_cxx::__normal_iterator<char*, std::basic_string
        <char, std::char_traits<char>, std::allocator<char> > >, 
    __gnu_cxx::__normal_iterator<char*, std::basic_string
        <char, std::char_traits<char>, std::allocator<char> > >, 
    std::back_insert_iterator<std::basic_string
        <char, std::char_traits<char>, std::allocator<char> > >,
    <unresolved overloaded function type>)’

我在这里想念什么吗? 与GCC有关的问题吗?

trans by 2019-11-11T03:16:45Z

C ++ 11 std :: to_string(double)-没有尾随零

今天,我尝试了C ++ 11 STL的一些新功能,并遇到了std::to_string

可爱,可爱的功能集。 对我来说,只为一次双字符串转换而创建一个stringstream对象似乎总是过大,因此我很高兴我们现在可以做这样的事情:

std::cout << std::to_string(0.33) << std::endl;

结果?

0.330000

我对此并不完全满意。 有没有办法告诉std::to_string省略尾随零? 我搜索了互联网,但据我所知,该函数仅接受一个参数(要转换的值)。 回到带有字符串流的“旧时代”,您可以设置流的宽度,但是我宁愿不转换回来。

任何人在解决之前/都遇到过这个问题吗? 一些StackOverflow搜索没有任何结果。

(一个C ++ 11 STL参考:[http://en.cppreference.com/w/cpp/string/basic_string/to_string)]

trans by 2019-11-10T12:33:50Z

c ++-用vector :: iterator或at()迭代STL向量更快吗?

在性能方面,什么会更快工作? 有区别吗? 是否依赖平台?

//1. Using vector<string>::iterator:
vector<string> vs = GetVector();

for(vector<string>::iterator it = vs.begin(); it != vs.end(); ++it)
{
   *it = "Am I faster?";
}

//2. Using size_t index:
for(size_t i = 0; i < vs.size(); ++i)
{
   //One option:
   vs.at(i) = "Am I faster?";
   //Another option:
   vs[i] = "Am I faster?";
}
trans by 2019-11-10T04:18:45Z

重载运算符<<时std :: endl类型未知

我重载了运算符<<

template <Typename T>
UIStream& operator<<(const T);

UIStream my_stream;
my_stream << 10 << " heads";

可以,但是:

my_stream << endl;

给出编译错误:

错误C2678:二进制'<<':未找到采用'UIStream'类型的左操作数的运算符(或者没有可接受的转换)

使my_stream << endl正常工作的工作是什么?

trans by 2019-11-07T12:59:23Z

c ++-不区分大小写的std :: string.find()

我正在使用Booststd::wstring方法来测试字符串是否是另一个的子字符串。 现在,我需要相同内容的不区分大小写的版本。 对于字符串比较,我始终可以转向wchar_t,但似乎没有stristr()

我找到了各种答案,大多数建议使用Boost,在我的情况下这不是一个选择。 此外,我需要支持std::wstring/wchar_t。 有任何想法吗?

trans by 2019-11-05T17:37:43Z

CodeGo.net>如何遍历priority_queue?

我可以使用迭代器(例如vector)遍历c ++中的标准priority_queue或标准queue吗? 我不想使用pop,因为它会导致我的队列出队。

谢谢你的帮助

trans by 2019-10-25T04:53:23Z

如何在std :: set <int>中找到最大的int?

我有std::set<int>,找到此集合中最大的int的正确方法是什么?

trans by 2019-10-25T01:44:00Z

c ++-hash_map是STL的一部分吗?

快速提问... hash_map是STL的一部分吗?

trans by 2019-10-24T18:49:53Z

如何使用带有用户定义类型作为键的std :: maps?

我想知道为什么不能将STL映射与用户定义的类一起使用。 当我编译下面的代码时,我收到以下神秘错误消息。 这是什么意思? 此外,为什么仅在用户定义的类型中发生这种情况? (将原始类型用作键时可以使用。)

C:\ MinGW \ bin .. \ lib \ gcc \ mingw32 \ 3.4.5 ........ \ include \ c ++ \ 3.4.5 \ bits \ stl_function.h ||在   成员函数`bool   std :: less <_Tp> :: operator()(const _Tp&,   const _Tp&)const [with _Tp =   类别1]':|

C:\ MinGW \ bin .. \ lib \ gcc \ mingw32 \ 3.4.5 ........ \ include \ c ++ \ 3.4.5 \ bits \ stl_map.h | 338 |已实例化   来自`_Tp&std :: map <_Key,_Tp,   _Compare,_Alloc> :: operator [](const _Key&)[with _Key = Class1,_Tp = int,_Compare = std :: less,_Alloc = std :: allocator>]'||

C:\ Users \ Admin \ Documents \ dev \ sandbox \ sandbox \ sandbox.cpp | 24 |实例化   从这里|

C:\ MinGW \ bin .. \ lib \ gcc \ mingw32 \ 3.4.5 ........ \ include \ c ++ \ 3.4.5 \ bits \ stl_function.h | 227 |错误:“ operator”不匹配 <'在'__x <   __y'| || ===构建完成:1个错误,0个警告=== |

#include <iostream>
#include <map>

using namespace std;

class Class1
{
public:
    Class1(int id);

private:
    int id;
};

Class1::Class1(int id): id(id)
{}

int main()
{
    Class1 c1(1);

    map< Class1 , int> c2int;
    c2int[c1] = 12;

    return 0;
}
trans by 2019-10-24T01:50:40Z

C ++-在std :: multiset中,如果找到一个元素,则有一个函数或算法可以擦除一个样本(单一或重复)

也许这是重复的,但是我没有找到任何搜索内容:在std::multiset上调用erase(value)时,将删除所有具有找到值的元素。 我能想到的唯一解决方案是:

std::multiset<int>::iterator hit(mySet.find(5));
if (hit!= mySet.end()) mySet.erase(hit);

可以,但是我认为可能会更好。 有任何想法吗 ?

trans by 2019-10-23T19:51:48Z

如何将迭代器增加2?

有人可以告诉我如何将迭代器增加2吗?

iter++可用-我必须做iter+2吗? 我该如何实现?

trans by 2019-10-14T16:55:44Z

合并两个STL映射

如何将两个STL映射合并为一个? 它们都具有相同的键值类型(映射)。 如果按键重叠,我想优先选择其中一张地图。

trans by 2019-10-13T22:28:03Z

增量迭代器等于STL包含的最终迭代器会发生什么

如果将指向向量的最后一个元素的迭代器增加2,该怎么办? 在这个问题中,如何通过2个元素将迭代器调整为STL容器,提供了两种不同的方法:

  • 要么使用一种形式的算术运算符-+ = 2或++两次
  • 或使用std :: advance()

当迭代器指向STL容器的最后一个元素或其他元素时,我已经用VC ++ 7测试了它们的边缘情况:

vector<int> vec;
vec.push_back( 1 );
vec.push_back( 2 );

vector<int>::iterator it = vec.begin();
advance( it, 2 );
bool isAtEnd = it == vec.end(); // true
it++; // or advance( it, 1 ); - doesn't matter
isAtEnd = it == vec.end(); //false
it = vec.begin();
advance( it, 3 );
isAtEnd = it == vec.end(); // false

我看过遍历vector和其他容器时可能会建议与vector :: end()进行比较:

for( vector<int>::iterator it = vec.begin(); it != vec.end(); it++ ) {
    //manipulate the element through the iterator here
}

显然,如果迭代器前进到循环内的最后一个元素之后,则for-loop语句中的比较将评估为false,并且循环将愉快地继续进行未定义的行为。

我是否正确,如果我在迭代器上使用了advance()或任何类型的增量操作,并使其指向容器的末端,我将无法检测到这种情况? 如果是这样,最佳实践是什么-不要使用这种进步?

trans by 2019-10-10T20:56:50Z

为什么std :: string操作执行不佳?

我进行了测试,比较了几种语言的字符串操作,以选择服务器端应用程序的语言。 在我最终尝试使用C ++之前,结果似乎是正常的,这使我感到非常惊讶。 所以我想知道我是否错过了任何优化并来这里寻求帮助。

测试主要是密集的字符串操作,包括连接和搜索。 该测试是在GCC版本4.6.1的Ubuntu 11.10 amd64上执行的。 该机器是带有4G RAM和四核CPU的Dell Optiplex 960。

在Python(2.7.2)中:

def test():
    x = ""
    limit = 102 * 1024
    while len(x) < limit:
        x += "X"
        if x.find("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 0) > 0:
            print("Oh my god, this is impossible!")
    print("x's length is : %d" % len(x))

test()

结果如下:

x's length is : 104448

real    0m8.799s
user    0m8.769s
sys     0m0.008s

在Java(OpenJDK-7)中:

public class test {
    public static void main(String[] args) {
        int x = 0;
        int limit = 102 * 1024;
        String s="";
        for (; s.length() < limit;) {
            s += "X";
            if (s.indexOf("ABCDEFGHIJKLMNOPQRSTUVWXYZ") > 0)
            System.out.printf("Find!\n");
        }
        System.out.printf("x's length = %d\n", s.length());
    }
}

结果如下:

x's length = 104448

real    0m50.436s
user    0m50.431s
sys     0m0.488s

在Javascript中(Nodejs 0.6.3)

function test()
{
    var x = "";
    var limit = 102 * 1024;
    while (x.length < limit) {
        x += "X";
        if (x.indexOf("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 0) > 0)
            console.log("OK");
    }
    console.log("x's length = " + x.length);
}();

结果如下:

x's length = 104448

real    0m3.115s
user    0m3.084s
sys     0m0.048s

在C ++中(g ++ -Ofast)

毫不奇怪,Node Js的性能优于Python或Java。 但是我希望libstdc ++的性能会比Nodejs好得多,后者的结果令我惊讶。

#include <iostream>
#include <string>
using namespace std;
void test()
{
    int x = 0;
    int limit = 102 * 1024;
    string s("");
    for (; s.size() < limit;) {
        s += "X";
        if (s.find("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 0) != string::npos)
            cout << "Find!" << endl;
    }
    cout << "x's length = " << s.size() << endl;
}

int main()
{
    test();
}

结果如下:

x length = 104448

real    0m5.905s
user    0m5.900s
sys     0m0.000s

简要总结

好的,现在让我们看一下摘要:

  • Nodejs(V8)上的JavaScript:3.1秒
  • CPython 2.7.2上的Python:8.8秒
  • 带有libstdc ++的C ++:5.9秒
  • OpenJDK 7上的Java:50.4s

出奇! 我在C ++中尝试了“ -O2,-O3”,但发现有所帮助。 在V8中,C ++似乎仅占javascript性能的50%,甚至比CPython还差。 谁能向我解释我是否错过了GCC的某些优化,或者只是这种情况? 非常感谢。

trans by 2019-10-08T14:42:05Z

为什么不应该派生自c ++ std字符串类?

我想问一下有效C ++中的特定观点。

它说:

如果一个类需要充当多态类,则应该将析构函数设为虚拟的。 它进一步补充说,由于Base* p = new Derived()没有虚拟析构函数,因此永远不要从中派生它。 std::string甚至都没有设计成基类,而忘记了多态基类。

我不明白类中要成为基础类(不是多态类)的具体要求是什么?

我不应该从Base* p = new Derived()类派生的唯一原因是它没有虚拟析构函数吗? 出于可重用性的目的,可以定义一个基类,并且可以从中继承多个派生类。 那么,是什么使std::string甚至没有资格作为基础类?

另外,如果存在纯粹出于可重用性目的而定义的基类,并且有许多派生类型,是否有任何方法可以防止客户端执行Base* p = new Derived(),因为这些类并非要用于多态性?

trans by 2019-10-07T06:43:23Z

1 2 3 4 5 6 7 下一页 共7页